Loading the Packages

library(pacman)
#p_install_gh("favstats/favstats")
p_load(tidyverse, haven,sjmisc,
                     forcats, weights, car,
                     countrycode, lavaan,
                     semTools, lavaan.survey,
                     survey, reshape2, favstats,
                     magrittr)

Loading the URLs

afro5_url <- url("https://github.com/favstats/database_delib/raw//master/afro5.RData")
afro6_url <- url("https://github.com/favstats/database_delib/raw//master/afro6.RData")
latino2013_url <- url("https://github.com/favstats/database_delib/raw//master/latino2013.RData")
latino2015_url <- url("https://github.com/favstats/database_delib/raw//master/latino2015.RData")
wvs_raw_url <- url("https://github.com/favstats/database_delib/raw//master/wvs_raw.RData")
americas_url <- url("https://github.com/favstats/database_delib/raw//master/americas.RData")
bolivia_url <- url("https://github.com/favstats/database_delib/raw//master/bolivia.RData")
canada_url <- url("https://github.com/favstats/database_delib/raw//master/canada.RData")
asian_raw_url <- url("https://github.com/favstats/database_delib/raw//master/asian_raw.RData")
myanmar_raw_url <- url("https://github.com/favstats/database_delib/raw//master/myanmar_raw.RData")
mongolia_raw_url <- url("https://github.com/favstats/database_delib/raw//master/mongolia_raw.RData")
philip_raw_url <- url("https://github.com/favstats/database_delib/raw//master/philip_raw.RData")
taiwan_raw_url <- url("https://github.com/favstats/database_delib/raw//master/taiwan_raw.RData")
thai_raw_url <- url("https://github.com/favstats/database_delib/raw//master/thai_raw.RData")
malay_raw_url <- url("https://github.com/favstats/database_delib/raw//master/malay_raw.RData")
singapore_raw_url <- url("https://github.com/favstats/database_delib/raw//master/singapore_raw.RData")
sk_raw_url <- url("https://github.com/favstats/database_delib/raw//master/sk_raw.RData")
cambodia_raw_url <- url("https://github.com/favstats/database_delib/raw//master/cambodia_raw.RData")
ESS_raw_url <- url("https://github.com/favstats/database_delib/blob/master/ESS_raw.Rdata?raw=true")
vdems_start_url <- url("https://github.com/favstats/database_delib/raw//master/vdems_start.Rdata")
qog_url <- url("https://github.com/favstats/database_delib/raw//master/qog.Rdata")

Afrobarometer Data

Afro 5

load(afro5_url)
delete_na_afro <- function(x) {
  x <- Recode(x, "9 = NA;
            98 = NA;
            99 = NA;
            -1 = NA")
  return(x)
} # Funktion um die NAs im Afro Datensatz zu bestimmen
# alle Variablen
afro_5 <- afro5 %>%
  rename(
    educ = Q97, # Variablen umbenennen
    income = Q3B,
    sex = Q101,
    work = Q96,
    trust_gov = Q59A,
    trust_parliament = Q59B,
    trust_police = Q59H,
    trust_courts = Q59J,
    demtoday = Q46A
  ) %>%
  mutate_at(
    vars(
      income, trust_gov, trust_parliament,
      trust_police, trust_courts, work
    ),
    delete_na_afro
  ) %>% # NAs deleten
  mutate(
    sex = sex - 1, # sex (0/1) codieren
    work = Recode(
      work, # work (0/1) codieren
      "1 = 0;
       2 = 1;
       3 = 1"
    ),
    age = Recode(
      Q1, # missing values l?schen
      "-1 = NA;
      998 = NA;
      999 = NA"
    ),
    demtoday = Recode(
      demtoday,
      "-1 = NA;
       98 = NA;
       99 = NA"
    ),
    educ = Recode(
      educ,
      "-1 = NA;
       98 = NA;
       99 = NA;
      999 = NA"
    ),
    cntry = to_label(COUNTRY_ALPHA),
    year = as.numeric(format(DATEINTR, "%Y"))
  ) %>%
  select(
    cntry, year, age, sex, income, educ, work, demtoday, 
    trust_gov, trust_parliament, trust_police, trust_courts
  )
afro_5

Afro 6

load(afro6_url)
afro_6 <- afro6 %>%
  rename(
    educ = Q97,
    income = Q4B,
    sex = Q101,
    work = Q95,
    trust_gov = Q52A,
    trust_parliament = Q52B,
    trust_police = Q52H,
    trust_courts = Q52J,
    demtoday = Q40
  ) %>%
  mutate_at(
    vars(
      income, demtoday, trust_gov,
      trust_parliament, trust_police,
      trust_courts, work
    ),
    delete_na_afro
  ) %>% # NAs deleten
  mutate(
    sex = sex - 1, # sex (0/1) codieren
    work = Recode(
      work, # work (0/1) codieren
      "1 = 0;
       2 = 1;
       3 = 1"
    ),
    age = Recode(
      Q1, # missing values l?schen
      "-1 = NA;
      998 = NA;
      999 = NA"
    ),
    educ = Recode(
      educ,
      "-1 = NA;
       98 = NA;
       99 = NA;
      999 = NA"
    ),
    demtoday = Recode(
      demtoday,
      "8 = NA"
    ),
    cntry = to_label(COUNTRY_R5List),
    year = as.numeric(format(DATEINTR, "%Y"))
  ) %>%
  #  mutate_at(vars(income, demtoday, educ, age,
  #                 trust_gov, trust_parliament,
  #                 trust_police, trust_courts),
  #            as.character) %>%
  #  mutate_at(vars(income, demtoday, educ, age,
  #                 trust_gov, trust_parliament,
  #                 trust_police, trust_courts),
  #            as.numeric) %>%
  select(
    cntry, year, age, sex, income,
    educ, work, demtoday,
    trust_gov, trust_parliament,
    trust_police, trust_courts
  ) 
afro_6

Merging the Data

afro_real <- afro_5 %>% 
  mutate_at(
    vars(
      income, demtoday, educ,
      trust_gov, trust_parliament,
      trust_police, trust_courts
    ),
    range01
  )
afro_real2 <- afro_6 %>% 
  mutate_at(
    vars(
      income, demtoday, educ,
      trust_gov, trust_parliament,
      trust_police, trust_courts
    ),
    range01
  )
# length(unique(afro_real$cntry))
# length(unique(afro_real2$cntry))
# table(afro_real2$year)
afro <- rbind(afro_real, afro_real2) %>% as.tbl()
afro

Latino Barometro

Latino 2013

load(latino2013_url)
latino_2013 <- latino2013 %>%
  rename(
    educ = REEDUC_1,
    income = S6,
    demtoday = P50TGB.A,
    age = S11
  ) %>%
  mutate(
    sex = S10 - 1, # sex variable erstellen
    cntry = to_label(IDENPA), # cntry variable erstellen
    trust_gov = 5 - P26TGB.B,
    trust_parliament = 5 - P26TGB.C,
    trust_police = 5 - P28TGB.B,
    trust_courts = 5 - P26TGB.E,
    year = 2013,
    income = 5 - income,
    work = Recode(
      S19.A,
      "2 = 1;
       3 = 1;
       4 = 0;
       5 = 0;
       6 = 0;
       7 = 0"
    )
  ) %>%
  select(
    cntry, year, age, sex, income, educ, work, demtoday, 
    trust_gov, trust_parliament, trust_police, trust_courts
  )
latino_2013

Latino 2015

load(latino2015_url)
latino_2015 <- latino2015 %>%
  mutate(sex = S12 - 1) %>% # sex variable erstellen
  rename(
    educ = REEDUC_1,
    income = S4,
    demtoday = P17STGBS,
    age = S13
  ) %>%
  mutate(
    trust_gov = 5 - P16ST.G,
    trust_parliament = 5 - P16ST.F,
    trust_police = 5 - P16TGB.B,
    trust_courts = 5 - P16ST.H,
    work = Recode(
      S21.A,
      "2 = 1;
       3 = 1;
       4 = 0;
       5 = 0;
       6 = 0;
       7 = 0"
    ),
    cntry = to_label(IDENPA),
    income = 5 - income,
    year = 2015
  ) %>%
  select(
    cntry, year, age, sex, income, educ, work, demtoday, 
    trust_gov, trust_parliament, trust_police, trust_courts
  )
latino_2015

Merging the Data

latino_real <- latino_2013 %>% 
  mutate_at(
    vars(
      income, demtoday, educ,
      trust_gov, trust_parliament,
      trust_police, trust_courts
    ),
    range01
  )
latino_real2 <- latino_2015 %>% 
  mutate_at(
    vars(
      income, demtoday, educ,
      trust_gov, trust_parliament,
      trust_police, trust_courts
    ),
    range01
  )
latino <- rbind(latino_real, latino_real2) %>% as.tbl()
latino

World Value Survey

load(wvs_raw_url)
wvs <- wvs_raw %>%
  rename(
    educ = V248,
    income = V239,
    demtoday = V141,
    age = V242,
    year = V262
  ) %>%
  mutate(
    sex = V240 - 1, # sex variable erstellen
    trust_gov = 5 - V115,
    trust_parliament = 5 - V117,
    trust_police = 5 - V113,
    trust_courts = 5 - V114,
    work = Recode(
      V229,
      "2 = 1;
       3 = 1;
       4 = 0;
       5 = 0;
       6 = 0;
       7 = 0;
       8 = 0"
    ),
    cntry = to_label(V2)
  ) %>%
  select(
    cntry, year, age, sex, income, educ, work, demtoday,
    trust_gov, trust_parliament,
    trust_police, trust_courts
  )
Warning: closing unused connection 23 (https://github.com/favstats/database_delib/raw//master/qog.Rdata)
Warning: closing unused connection 22 (https://github.com/favstats/database_delib/raw//master/vdems_start.Rdata)
wvs

Americas Barometer

Americas Main

load(americas_url)
americas_ <- americas %>%
  mutate(cntry = to_label(pais)) %>%
  select(
    cntry, ocup4a, ed, q10new, q1, q2,
    b10a, b13, b18, b21a, n3, year
  ) %>%
  rename(
    work = ocup4a,
    educ = ed,
    income = q10new,
    sex = q1,
    age = q2,
    trust_courts = b10a,
    trust_parliament = b13,
    trust_police = b18,
    trust_gov = b21a,
    demtoday = n3
  ) %>%
  mutate(
    sex = sex - 1, # sex variable erstellen
    work = Recode(
      work,
      "2 = 1;
       3 = 1;
       4 = 0;
       5 = 0;
       6 = 0;
       7 = 0"
    )
  ) %>%
  select(
    cntry, year, age, sex, income, educ, work, demtoday, 
    trust_gov, trust_parliament, trust_police, trust_courts
  )
americas_

Bolivia

load(bolivia_url)
bolivia_ <- bolivia %>%
  mutate(cntry = to_label(pais)) %>%
  select(
    cntry, ocup4a, ed, q10new, q1, q2,
    b10a, b13, b18, b21a, n3, year
  ) %>%
  rename(
    work = ocup4a,
    educ = ed,
    income = q10new,
    sex = q1,
    age = q2,
    trust_courts = b10a,
    trust_parliament = b13,
    trust_police = b18,
    trust_gov = b21a, # viele missing values
    demtoday = n3
  ) %>%
  mutate(
    sex = sex - 1, # sex variable erstellen
    work = Recode(
      work,
      "2 = 1;
       3 = 1;
       4 = 0;
       5 = 0;
       6 = 0;
       7 = 0"
    )
  ) %>%
  select(
    cntry, year, age, sex, income, educ, work, demtoday, 
    trust_gov, trust_parliament, trust_police, trust_courts
  )
bolivia_

Canada

load(canada_url)
canada_ <- canada %>%
  mutate(cntry = to_label(pais)) %>%
  select(
    cntry, exc13, education, q10, q1, q2,
    b10a, b13, b18, b21a, n3, year
  ) %>%
  rename(
    work = exc13,
    educ = education,
    income = q10,
    sex = q1,
    age = q2,
    trust_courts = b10a,
    trust_parliament = b13,
    trust_police = b18,
    trust_gov = b21a,
    demtoday = n3
  ) %>%
  mutate(
    sex = sex - 1, # sex variable erstellen
    work = work - 1,
    income = ifelse(income == 88, NA, income)
  ) %>%
  select(
    cntry, year, age, sex, income, educ, work, demtoday, 
    trust_gov, trust_parliament, trust_police, trust_courts
  )
canada_

Merging the Data

americas <- americas_ %>% 
  mutate_at(
    vars(
      income, demtoday, educ,
      trust_gov, trust_parliament,
      trust_police, trust_courts
    ),
    range01
  )
bolivia <- bolivia_ %>% 
  mutate_at(
    vars(
      income, demtoday, educ,
      trust_gov, trust_parliament,
      trust_police, trust_courts
    ),
    range01
  )
canada <- canada_ %>% 
  mutate_at(
    vars(
      income, demtoday, educ,
      trust_gov, trust_parliament,
      trust_police, trust_courts
    ),
    range01
  )
americas <- rbind(americas, bolivia, canada)
americas

Asian Barometer

load(asian_raw_url)
delete_na_asian <- function(x) {
  x <- Recode(
    x,
    "-2 = NA;
      7 = NA;
      8 = NA;
      9 = NA;
     97 = NA;
     98 = NA;
     99 = NA;
     -1 = NA"
  )
  return(x)
} # Funktion um die NAs im asian Datensatz zu bestimmen
asian_3 <- asian_raw %>%
  rename(
    educ = se5,
    trust_gov = q9,
    trust_parliament = q11,
    trust_police = q14,
    trust_courts = q8,
    sex = se2,
    income = se13a,
    work = se9
  ) %>%
  mutate_at(
    vars(
      income, trust_gov, trust_parliament,
      trust_police, trust_courts, work, sex
    ),
    delete_na_asian
  ) %>% # NAs deleten
  mutate(
    trust_gov = 5 - trust_gov,
    trust_parliament = 5 - trust_parliament,
    trust_police = 5 - trust_police,
    trust_courts = 5 - trust_courts,
    sex = sex - 1, # sex (0/1) codieren
    income = Recode(
      income,
      "0 = NA"
    ),
    income = 5 - income,
    work = Recode(
      work, # work (0/1) codieren
      "2 = 0"
    ),
    age = Recode(
      se3a, # missing values l?schen
      "-1 = NA"
    ),
    demtoday = Recode(
      q91,
      "-1 = NA;
       97 = NA;
       98 = NA;
       99 = NA"
    ),
    educ = Recode(
      educ,
      "-1 = NA;
       98 = NA;
       99 = NA"
    ),
    cntry = to_label(country),
    year = as.numeric(format(ir9, "%Y"))
  ) %>%
  select(
    cntry, year, age, sex, income, educ, work, demtoday, 
    trust_gov, trust_parliament, trust_police, trust_courts
  ) 
asian_3

Wave 4

load(myanmar_raw_url)
needed <- function(data) {
  ss <- data %>%
    rename(
      educ = se5,
      trust_gov = q9,
      trust_parliament = q11,
      trust_police = q14,
      trust_courts = q8,
      sex = se2,
      income = se13a,
      work = se9
    ) %>%
    mutate_at(
      vars(
        trust_gov, trust_parliament,
        trust_police, trust_courts, work, sex
      ),
      delete_na_asian
    ) %>% # NAs deleten
    mutate(
      trust_gov = 5 - trust_gov,
      trust_parliament = 5 - trust_parliament,
      trust_police = 5 - trust_police,
      trust_courts = 5 - trust_courts,
      sex = sex - 1, # sex (0/1) codieren
      income = Recode(
        income,
        "0 = NA;
        97 = NA;
        98 = NA;
        99 = NA;
        -1 = NA"
      ),
      work = Recode(
        work, # work (0/1) codieren
        "2 = 0"
      ),
      age = Recode(
        se3_2, # missing values l?schen
        "-1 = NA"
      ),
      demtoday = Recode(
        q94,
        "-1 = NA;
         97 = NA;
         98 = NA;
         99 = NA"
      ),
      educ = Recode(
        educ,
        "-1 = NA;
         98 = NA;
         99 = NA"
      ),
      cntry = to_label(country),
      year = year
    ) %>%
    select(
      cntry, year, age, sex, income, educ, work, demtoday, 
      trust_gov, trust_parliament, trust_police, trust_courts
    )
  
  return(ss)
}
myanmar <- needed(myanmar_raw)
load(mongolia_raw_url)
load(philip_raw_url)
load(taiwan_raw_url)
load(thai_raw_url)
load(malay_raw_url)
load(singapore_raw_url)
load(sk_raw_url)
load(cambodia_raw_url)
mongolia  <- needed(mongolia_raw)
philip    <- needed(philip_raw)
thai      <- needed(thai_raw)
malay     <- needed(malay_raw)
singapore <- needed(singapore_raw) # Singapore hat extrem viele Missing values
sk        <- needed(sk_raw)
cambodia  <- needed(cambodia_raw)

Sonderfall Taiwan

# Taiwan Problem: Income only has 3 categories
taiwan <- taiwan_raw %>%
    rename(
      educ = se5,
      trust_gov = q9,
      trust_parliament = q11,
      trust_police = q14,
      trust_courts = q8,
      sex = se2,
      income = se14a,
      work = se9
    ) %>%
    mutate_at(
      vars(
        income, trust_gov, trust_parliament,
        trust_police, trust_courts, work, sex
      ),
      delete_na_asian
    ) %>% # NAs deleten
    mutate(
      trust_gov = 5 - trust_gov,
      trust_parliament = 5 - trust_parliament,
      trust_police = 5 - trust_police,
      trust_courts = 5 - trust_courts,
      sex = sex - 1, # sex (0/1) codieren
      income = Recode(
        4 - income,
        "8 = NA;
         9 = NA"
      ),
      work = Recode(
        work, # work (0/1) codieren
        "2 = 0"
      ),
      age = Recode(
        se3_2, # missing values l?schen
        "-1 = NA"
      ),
      demtoday = Recode(
        q94,
        "-1 = NA;
         97 = NA;
         98 = NA;
         99 = NA"
      ),
      educ = Recode(
        educ,
        "-1 = NA;
         98 = NA;
         99 = NA"
      ),
      cntry = to_label(country),
      year = year
    ) %>%
    select(
      cntry, year, age, sex, income, educ, work, demtoday, 
      trust_gov, trust_parliament, trust_police, trust_courts
    )

Merging Data

asian_3 %<>%
    mutate_at(
      vars(
        income, demtoday, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )
myanmar %<>%
    mutate_at(
      vars(
        income, demtoday, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )
mongolia %<>%
    mutate_at(
      vars(
        income, demtoday, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )
philip %<>%
    mutate_at(
      vars(
        income, demtoday, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )  
taiwan %<>%
    mutate_at(
      vars(
        income, demtoday, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )  
thai %<>%
    mutate_at(
      vars(
        income, demtoday, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )
malay %<>%
    mutate_at(
      vars(
        income, demtoday, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )
singapore %<>%
    mutate_at(
      vars(
        income, demtoday, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )
sk %<>%
    mutate_at(
      vars(
        income, demtoday, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )
cambodia %<>%
    mutate_at(
      vars(
        income, demtoday, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )
asian <- rbind(
  asian_3, myanmar, cambodia, sk, singapore, malay, thai, taiwan, philip,
  cambodia, mongolia
) %>% as.tbl()
asian

European Social Survey

load(ESS_raw_url)
ESS <- ESS_raw %>%
  rename(
    demtoday = dmcntov,
    age = agea,
    year = inwyys,
    trust_gov = trstplt,
    trust_parliament = trstprl,
    trust_police = trstplc,
    trust_courts = trstlgl
  ) %>%
  mutate(
    income = 5 - hincfel,
    educ = Recode(
      eisced,
      "55 = NA"
    ),
    work = ifelse(mnactic == 1, 1, 0),
    sex = gndr - 1, # sex variable erstellen
    cntry = to_label(cntry)
  ) %>%  
  mutate_at(
    vars(
      income, demtoday, educ,
      trust_gov, trust_parliament,
      trust_police, trust_courts
    ),
    stdz
  ) %>%
  select(
    cntry, year, age, sex, income, educ, work, demtoday, trust_gov, trust_parliament,
    trust_police, trust_courts
  )
ESS

Merging Everything

afro %<>% 
  mutate(survey = rep("afro", nrow(afro))) %>% 
  mutate(cntry = countrycode(cntry, "country.name.en", "country.name.en")) 
latino %<>%  
  mutate(survey = rep("latino", nrow(latino))) %>% 
  mutate(cntry = countrycode(cntry, "country.name.en", "country.name.en"))
americas %<>%  
  mutate(survey = rep("americas", nrow(americas))) %>% 
  mutate(cntry = countrycode(cntry, "country.name.en", "country.name.en"))
Some values were not matched unambiguously: Hait攼㹤
asian %<>%  
  mutate(survey = rep("asian", nrow(asian))) %>% 
  mutate(cntry = countrycode(cntry, "country.name.en", "country.name.en"))
wvs %<>%  
  mutate(survey = rep("wvs", nrow(wvs))) %>% 
  mutate(cntry = countrycode(cntry, "country.name.en", "country.name.en")) %<>%
    mutate_at(
      vars(
        income, demtoday, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )
ESS %<>%  
  mutate(survey = rep("ESS", nrow(ESS))) %>% 
  mutate(cntry = countrycode(cntry, "country.name.en", "country.name.en")) %<>%
    mutate_at(
      vars(
        income, demtoday, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )
unique(ESS$cntry)
 [1] "Albania"                                             
 [2] "Belgium"                                             
 [3] "Bulgaria"                                            
 [4] "Switzerland"                                         
 [5] "Cyprus"                                              
 [6] "Czech Republic"                                      
 [7] "Germany"                                             
 [8] "Denmark"                                             
 [9] "Estonia"                                             
[10] "Spain"                                               
[11] "Finland"                                             
[12] "France"                                              
[13] "United Kingdom of Great Britain and Northern Ireland"
[14] "Hungary"                                             
[15] "Ireland"                                             
[16] "Israel"                                              
[17] "Iceland"                                             
[18] "Italy"                                               
[19] "Lithuania"                                           
[20] "Netherlands"                                         
[21] "Norway"                                              
[22] "Poland"                                              
[23] "Portugal"                                            
[24] "Russian Federation"                                  
[25] "Sweden"                                              
[26] "Slovenia"                                            
[27] "Slovakia"                                            
[28] "Ukraine"                                             
[29] "Kosovo"                                              
unique(asian$cntry)
 [1] "Japan"                     "Hong Kong"                
 [3] "Republic of Korea"         "China"                    
 [5] "Mongolia"                  "Philippines"              
 [7] "Taiwan, Province of China" "Thailand"                 
 [9] "Indonesia"                 "Singapore"                
[11] "Viet Nam"                  "Cambodia"                 
[13] "Malaysia"                  "Myanmar"                  
unique(wvs$cntry)
 [1] "Algeria"                   "Argentina"                
 [3] "Armenia"                   "Australia"                
 [5] "Azerbaijan"                "Bahrain"                  
 [7] "Belarus"                   "Brazil"                   
 [9] "Colombia"                  "Cyprus"                   
[11] "Chile"                     "China"                    
[13] "Ecuador"                   "Egypt"                    
[15] "Estonia"                   "Georgia"                  
[17] "Germany"                   "Ghana"                    
[19] "Hong Kong"                 "India"                    
[21] "Iraq"                      "Japan"                    
[23] "Jordan"                    "Kazakhstan"               
[25] "Kuwait"                    "Kyrgyzstan"               
[27] "Lebanon"                   "Libya"                    
[29] "Malaysia"                  "Mexico"                   
[31] "Morocco"                   "Netherlands"              
[33] "New Zealand"               "Nigeria"                  
[35] "Pakistan"                  "Palestine, State of"      
[37] "Peru"                      "Philippines"              
[39] "Poland"                    "Qatar"                    
[41] "Romania"                   "Russian Federation"       
[43] "Rwanda"                    "Singapore"                
[45] "Slovenia"                  "Republic of Korea"        
[47] "South Africa"              "Spain"                    
[49] "Sweden"                    "Taiwan, Province of China"
[51] "Thailand"                  "Trinidad and Tobago"      
[53] "Tunisia"                   "Turkey"                   
[55] "Ukraine"                   "United States of America" 
[57] "Uruguay"                   "Uzbekistan"               
[59] "Yemen"                     "Zimbabwe"                 
unique(latino$cntry)
 [1] "Argentina"                         "Bolivia (Plurinational State of)" 
 [3] "Brazil"                            "Colombia"                         
 [5] "Costa Rica"                        "Chile"                            
 [7] "Ecuador"                           "El Salvador"                      
 [9] "Spain"                             "Guatemala"                        
[11] "Honduras"                          "Mexico"                           
[13] "Nicaragua"                         "Panama"                           
[15] "Paraguay"                          "Peru"                             
[17] "Dominican Republic"                "Uruguay"                          
[19] "Venezuela, Bolivarian Republic of"
unique(americas$cntry)
 [1] "Bahamas"                          "Barbados"                        
 [3] "Belize"                           "Brazil"                          
 [5] "Colombia"                         "Costa Rica"                      
 [7] "Dominican Republic"               "Ecuador"                         
 [9] "El Salvador"                      "Guatemala"                       
[11] "Guyana"                           NA                                
[13] "Honduras"                         "Jamaica"                         
[15] "Mexico"                           "Nicaragua"                       
[17] "Panama"                           "Paraguay"                        
[19] "Peru"                             "Suriname"                        
[21] "Trinidad and Tobago"              "Uruguay"                         
[23] "Bolivia (Plurinational State of)" "Canada"                          
unique(afro$cntry)
 [1] "Algeria"                     "Burundi"                    
 [3] "Benin"                       "Burkina Faso"               
 [5] "Botswana"                    "Cameroon"                   
 [7] "Côte D'Ivoire"               "Cabo Verde"                 
 [9] "Egypt"                       "Ghana"                      
[11] "Guinea"                      "Kenya"                      
[13] "Lesotho"                     "Liberia"                    
[15] "Madagascar"                  "Mauritius"                  
[17] "Mali"                        "Malawi"                     
[19] "Mozambique"                  "Morocco"                    
[21] "Namibia"                     "Niger"                      
[23] "Nigeria"                     "South Africa"               
[25] "Senegal"                     "Sierra Leone"               
[27] "Sudan"                       "Swaziland"                  
[29] "United Republic of Tanzania" "Togo"                       
[31] "Tunisia"                     "Uganda"                     
[33] "Zambia"                      "Zimbabwe"                   
[35] "Gabon"                       "Sao Tome and Principe"      
merged <- rbind(wvs, latino, afro, americas, asian, ESS)
merged %<>%
  # create dummies
  mutate(
    wvs = ifelse(survey == "wvs", 1, 0),
    afro = ifelse(survey == "afro", 1, 0),
    latino = ifelse(survey == "latino", 1, 0),
    americas = ifelse(survey == "americas", 1, 0),
    asian = ifelse(survey == "asian", 1, 0),
    ESS = ifelse(survey == "ESS", 1, 0)
  ) %>%
  # filter bad countries
  filter(cntry != "Egypt") %>% # exclude Egypt 2013
  filter(cntry != "Libya") %>% # exclude Libya 2014
  filter(cntry != "Mali") %>% # exclude Mali 2012
  filter(cntry != "Yemen") %>% # exclude Yemen 2012
  filter(cntry != "Palestine, State of") # exclude Palestine 2013
# adding weight
merged %<>%
  group_by(cntry) %>%
  tally() %>%
  mutate(weight = 1000 / n) %>%
  select(cntry, weight) %>%
  left_join(merged, "cntry")
# select(cntry, year) %>%
# unique %>%
# View
merged
table(merged$wvs)

     0      1 
301009  80618 
table(merged$afro)

     0      1 
280893 100734 
table(merged$latino)

     0      1 
338714  42913 
table(merged$americas)

     0      1 
311125  70502 
table(merged$asian)

     0      1 
349440  32187 
table(merged$ESS)

     0      1 
326954  54673 

SEM Index

merged2 <- merged %>%
  mutate(gov_trust = trust_gov + trust_parliament + 
           trust_police + trust_courts) %>%
  filter(!is.na(gov_trust))
merged3 <- merged %>%
  mutate(gov_trust = trust_gov + trust_parliament + 
           trust_police + trust_courts) %>%
  filter(is.na(gov_trust))
svy.df <- survey::svydesign(id= ~1,
                              weights= ~weight,
                              data= merged) 
model <- '# measurement model 1
gov_trust2 =~ 1*trust_gov + trust_parliament + 
trust_police + trust_courts
trust_gov ~~ trust_parliament
'
merged <- merged %>%
  mutate_at(vars(trust_gov, trust_parliament,
                 trust_police, trust_courts), as.numeric)
# cor(na.omit(data.frame(merged$trust_gov,
#               merged$trust_police,
#               merged$trust_courts,
#               merged$trust_parliament,
#               merged$demtoday)))
lavaan_model1<-cfa(model, meanstructure = T, 
                   data = as.data.frame(merged),
                   estimator= "MLM")
fit_a1<-lavaan.survey(lavaan_model1, 
            estimator= "MLM", survey.design=svy.df)
summary(fit_a1, standardized=TRUE,fit.measures = TRUE, rsq = T)
lavaan (0.5-23.1097) converged normally after  38 iterations

  Number of observations                        339509

  Estimator                                         ML      Robust
  Minimum Function Test Statistic                4.858       2.577
  Degrees of freedom                                 1           1
  P-value (Chi-square)                           0.028       0.108
  Scaling correction factor                                  1.885
    for the Satorra-Bentler correction

Model test baseline model:

  Minimum Function Test Statistic           503887.369  334369.533
  Degrees of freedom                                 6           6
  P-value                                        0.000       0.000

User model versus baseline model:

  Comparative Fit Index (CFI)                    1.000       1.000
  Tucker-Lewis Index (TLI)                       1.000       1.000

  Robust Comparative Fit Index (CFI)                         1.000
  Robust Tucker-Lewis Index (TLI)                            1.000

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)             -159340.600  -159340.600
  Loglikelihood unrestricted model (H1)     -159338.171  -159338.171

  Number of free parameters                         13          13
  Akaike (AIC)                              318707.201  318707.201
  Bayesian (BIC)                            318846.759  318846.759
  Sample-size adjusted Bayesian (BIC)       318805.445  318805.445

Root Mean Square Error of Approximation:

  RMSEA                                          0.003       0.002
  90 Percent Confidence Interval          0.001  0.007       0.000  0.005
  P-value RMSEA <= 0.05                          1.000       1.000

  Robust RMSEA                                               0.003
  90 Percent Confidence Interval                             0.000  0.008

Standardized Root Mean Square Residual:

  SRMR                                           0.000       0.000

Parameter Estimates:

  Information                                 Expected
  Standard Errors                           Robust.sem

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  gov_trust2 =~                                                         
    trust_gov         1.000                               0.208    0.613
    trust_parlimnt    1.015    0.003  330.156    0.000    0.211    0.653
    trust_police      1.099    0.004  253.511    0.000    0.228    0.700
    trust_courts      1.315    0.005  247.330    0.000    0.273    0.847

Covariances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
 .trust_gov ~~                                                          
   .trust_parlimnt    0.029    0.000  123.012    0.000    0.029    0.438

Intercepts:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .trust_gov         0.484    0.001  715.884    0.000    0.484    1.428
   .trust_parlimnt    0.456    0.001  703.812    0.000    0.456    1.414
   .trust_police      0.536    0.001  822.959    0.000    0.536    1.644
   .trust_courts      0.515    0.001  796.359    0.000    0.515    1.595
    gov_trust2        0.000                               0.000    0.000

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .trust_gov         0.072    0.000  259.086    0.000    0.072    0.624
   .trust_parlimnt    0.060    0.000  226.846    0.000    0.060    0.573
   .trust_police      0.054    0.000  218.146    0.000    0.054    0.510
   .trust_courts      0.029    0.000  107.510    0.000    0.029    0.282
    gov_trust2        0.043    0.000  148.215    0.000    1.000    1.000

R-Square:
                   Estimate
    trust_gov         0.376
    trust_parlimnt    0.427
    trust_police      0.490
    trust_courts      0.718
merged4<-cbind(merged2, predict(fit_a1, newdata = merged2))
merged4$gov_trust2<-range01(merged4$gov_trust2)
# head(merged4)
merged<-plyr::rbind.fill(merged3,merged4)
merged$gov_trust<-merged$gov_trust2
head(merged)

Some Recoding

table(merged$cntry,merged$year)
                                                      
                                                       1582 1583 2000 2010
  Albania                                                 0    0    0    0
  Algeria                                                 0    0    0    0
  Argentina                                               0    0    0    0
  Armenia                                                 0    0    0    0
  Australia                                               0    0    0    0
  Azerbaijan                                              0    0    0    0
  Bahamas                                                 0    0    0    0
  Bahrain                                                 0    0    0    0
  Barbados                                                0    0    0    0
  Belarus                                                 0    0    0    0
  Belgium                                                 0    0    0    0
  Belize                                                  0    0    0    0
  Benin                                                   0    0    0    0
  Bolivia (Plurinational State of)                        0    0    0    0
  Botswana                                                0    0    0    0
  Brazil                                                  0    0    0    0
  Bulgaria                                                0    0    0    0
  Burkina Faso                                            0    0    0    0
  Burundi                                                 0    0    0    0
  Cabo Verde                                              0    0    0    0
  Cambodia                                                0    0    0    0
  Cameroon                                                0    0    0    0
  Canada                                                  0    0    0 1500
  Chile                                                   0    0    0    0
  China                                                   0    3    1    0
  Colombia                                                0    0    0    0
  Costa Rica                                              0    0    0    0
  Côte D'Ivoire                                           0    0    0    0
  Cyprus                                                  0    0    0    0
  Czech Republic                                          0    0    0    0
  Denmark                                                 0    0    0    0
  Dominican Republic                                      0    0    0    0
  Ecuador                                                 0    0    0    0
  El Salvador                                             0    0    0    0
  Estonia                                                 0    0    0    0
  Finland                                                 0    0    0    0
  France                                                  0    0    0    0
  Gabon                                                   0    0    0    0
  Georgia                                                 0    0    0    0
  Germany                                                 0    0    0    0
  Ghana                                                   0    0    0    0
  Guatemala                                               0    0    0    0
  Guinea                                                  0    0    0    0
  Guyana                                                  0    0    0    0
  Honduras                                                0    0    0    0
  Hong Kong                                               0    0    0    0
  Hungary                                                 0    0    0    0
  Iceland                                                 0    0    0    0
  India                                                   0    0    0    0
  Indonesia                                               0    0    0    0
  Iraq                                                    0    0    0    0
  Ireland                                                 0    0    0    0
  Israel                                                  0    0    0    0
  Italy                                                   0    0    0    0
  Jamaica                                                 0    0    0    0
  Japan                                                   0    0    0 2443
  Jordan                                                  0    0    0    0
  Kazakhstan                                              0    0    0    0
  Kenya                                                   0    0    0    0
  Kosovo                                                  0    0    0    0
  Kuwait                                                  0    0    0    0
  Kyrgyzstan                                              0    0    0    0
  Lebanon                                                 0    0    0    0
  Lesotho                                                 0    0    0    0
  Liberia                                                 0    0    0    0
  Lithuania                                               0    0    0    0
  Madagascar                                              0    0    0    0
  Malawi                                                  0    0    0    0
  Malaysia                                                0    0    0    0
  Mauritius                                               0    0    0    0
  Mexico                                                  0    0    0    0
  Mongolia                                                0    0    0 1210
  Morocco                                                 0    0    0    0
  Mozambique                                              0    0    0    0
  Myanmar                                                 0    0    0    0
  Namibia                                                 0    0    0    0
  Netherlands                                             0    0    0    0
  New Zealand                                             0    0    0    0
  Nicaragua                                               0    0    0    0
  Niger                                                   0    0    0    0
  Nigeria                                                 0    0    0    0
  Norway                                                  0    0    0    0
  Pakistan                                                0    0    0    0
  Panama                                                  0    0    0    0
  Paraguay                                                0    0    0    0
  Peru                                                    0    0    0    0
  Philippines                                             0    0    0 1200
  Poland                                                  0    0    0    0
  Portugal                                                0    0    0    0
  Qatar                                                   0    0    0 1060
  Republic of Korea                                       0    0    0 1200
  Romania                                                 0    0    0    0
  Russian Federation                                      0    0    0    0
  Rwanda                                                  0    0    0    0
  Sao Tome and Principe                                   0    0    0    0
  Senegal                                                 0    0    0    0
  Sierra Leone                                            0    0    0    0
  Singapore                                            1000    0    0    0
  Slovakia                                                0    0    0    0
  Slovenia                                                0    0    0    0
                                                      
                                                       2011 2012 2013 2014
  Albania                                                 0  615  586    0
  Algeria                                                 0    0 2404    0
  Argentina                                               0    0 2230    0
  Armenia                                              1100    0    0    0
  Australia                                               0 1477    0    0
  Azerbaijan                                           1002    0    0    0
  Bahamas                                                 0    0    0 3429
  Bahrain                                                 0    0    0 1200
  Barbados                                                0    0    0 3828
  Belarus                                              1535    0    0    0
  Belgium                                                 0 1869    0    0
  Belize                                                  0 1512    0 1533
  Benin                                                1200    0    0 1200
  Bolivia (Plurinational State of)                        0 3029 1200    0
  Botswana                                                0 1200    0 1200
  Brazil                                                  0 1499 1204 2986
  Bulgaria                                                0    0 2260    0
  Burkina Faso                                            0 1200    0    0
  Burundi                                                 0 1200    0 1200
  Cabo Verde                                           1208    0    0 1200
  Cambodia                                                0 1200    0    0
  Cameroon                                                0    0 1200    0
  Canada                                                  0    0    0    0
  Chile                                                1000    0 1200    0
  China                                                3408 2360    0    0
  Colombia                                                0 3024 1200 1496
  Costa Rica                                              0 1498 1000 1537
  Côte D'Ivoire                                           0    0 1200 1199
  Cyprus                                               1000 1089   27    0
  Czech Republic                                          0    0 2009    0
  Denmark                                                 0    0 1650    0
  Dominican Republic                                      0 1512 1000 1520
  Ecuador                                                 0 1500 2402    0
  El Salvador                                             0 1497 1000 1512
  Estonia                                              1533 2279  101    0
  Finland                                                 0 1884  313    0
  France                                                  0    0 1968    0
  Gabon                                                   0    0    0    0
  Georgia                                                 0    0    0 1202
  Germany                                                 0 2753 2251    0
  Ghana                                                   0 3952    0 2400
  Guatemala                                               0 1509 1000 1506
  Guinea                                                  0    0 1200    0
  Guyana                                                  0 1529    0 1557
  Honduras                                                0 1728 1000 1561
  Hong Kong                                               0 1207 1000    0
  Hungary                                                 0 1895  119    0
  Iceland                                                 0  601  151    0
  India                                                   0    0    0 1581
  Indonesia                                            1550    0    0    0
  Iraq                                                    0 1200    0    0
  Ireland                                                 0  995 1633    0
  Israel                                                  0 2229  279    0
  Italy                                                   0    0  960    0
  Jamaica                                                 0 1500    0 1503
  Japan                                                1880    0    0    0
  Jordan                                                  0    0    0 1200
  Kazakhstan                                           1500    0    0    0
  Kenya                                                2399    0    0 2397
  Kosovo                                                  0    0 1295    0
  Kuwait                                                  0    0    0 1303
  Kyrgyzstan                                           1500    0    0    0
  Lebanon                                                 0    0 1200    0
  Lesotho                                                 0 1197    0 1200
  Liberia                                                 0 1199    0    0
  Lithuania                                               0    0 2109    0
  Madagascar                                              0    0 1200 1015
  Malawi                                                  0 2407    0 2400
  Malaysia                                             1214 1300    0 1207
  Mauritius                                               0 1200    0 1200
  Mexico                                                  0 3560 1200 1535
  Mongolia                                                0    0    0 1228
  Morocco                                              1200    0 1196    0
  Mozambique                                              0 2400    0    0
  Myanmar                                                 0    0    0    0
  Namibia                                                 0 1200    0 1200
  Netherlands                                             0 3381  366    0
  New Zealand                                           841    0    0    0
  Nicaragua                                               0 1686 1000 1546
  Niger                                                   0    0 1199    0
  Nigeria                                              1759 2364   36 2319
  Norway                                                  0 1446  178    0
  Pakistan                                                0 1200    0    0
  Panama                                                  0 1620 1000 1508
  Paraguay                                                0 1510 1200 1503
  Peru                                                    0 2710 1200 1500
  Philippines                                             0 1200    0 1200
  Poland                                                  0 2851   13    0
  Portugal                                                0  395 1756    0
  Qatar                                                   0    0    0    0
  Republic of Korea                                    1207    0    0    0
  Romania                                                 0 1503    0    0
  Russian Federation                                   2500 2484    0    0
  Rwanda                                                  0 1527    0    0
  Sao Tome and Principe                                   0    0    0    0
  Senegal                                                 0    0 1200 1200
  Sierra Leone                                            0 1190    0    0
  Singapore                                               0 1972    0  993
  Slovakia                                                0 1415  432    0
  Slovenia                                             1069 1257    0    0
                                                      
                                                       2015 2077
  Albania                                                 0    0
  Algeria                                              1200    0
  Argentina                                            1200    0
  Armenia                                                 0    0
  Australia                                               0    0
  Azerbaijan                                              0    0
  Bahamas                                                 0    0
  Bahrain                                                 0    0
  Barbados                                                0    0
  Belarus                                                 0    0
  Belgium                                                 0    0
  Belize                                                  0    0
  Benin                                                   0    0
  Bolivia (Plurinational State of)                     1200    0
  Botswana                                                0    0
  Brazil                                               1250    0
  Bulgaria                                                0    0
  Burkina Faso                                         1200    0
  Burundi                                                 0    0
  Cabo Verde                                              0    0
  Cambodia                                             2400    0
  Cameroon                                             1182    0
  Canada                                                  0    0
  Chile                                                1200    0
  China                                                   0    1
  Colombia                                             1200    0
  Costa Rica                                           1000    0
  Côte D'Ivoire                                           0    0
  Cyprus                                                  0    0
  Czech Republic                                          0    0
  Denmark                                                 0    0
  Dominican Republic                                   1000    0
  Ecuador                                              1200    0
  El Salvador                                          1000    0
  Estonia                                                 0    0
  Finland                                                 0    0
  France                                                  0    0
  Gabon                                                1198    0
  Georgia                                                 0    0
  Germany                                                 0    0
  Ghana                                                   0    0
  Guatemala                                            1000    0
  Guinea                                               1200    0
  Guyana                                                  0    0
  Honduras                                             1000    0
  Hong Kong                                               0    0
  Hungary                                                 0    0
  Iceland                                                 0    0
  India                                                   0    0
  Indonesia                                               0    0
  Iraq                                                    0    0
  Ireland                                                 0    0
  Israel                                                  0    0
  Italy                                                   0    0
  Jamaica                                                 0    0
  Japan                                                   0    0
  Jordan                                                  0    0
  Kazakhstan                                              0    0
  Kenya                                                   0    0
  Kosovo                                                  0    0
  Kuwait                                                  0    0
  Kyrgyzstan                                              0    0
  Lebanon                                                 0    0
  Lesotho                                                 0    0
  Liberia                                              1199    0
  Lithuania                                               0    0
  Madagascar                                            185    0
  Malawi                                                  0    0
  Malaysia                                                0    0
  Mauritius                                               0    0
  Mexico                                               1200    0
  Mongolia                                                0    0
  Morocco                                              1200    0
  Mozambique                                           2400    0
  Myanmar                                              1620    0
  Namibia                                                 0    0
  Netherlands                                             0    0
  New Zealand                                             0    0
  Nicaragua                                            1000    0
  Niger                                                1200    0
  Nigeria                                                81    0
  Norway                                                  0    0
  Pakistan                                                0    0
  Panama                                               1000    0
  Paraguay                                             1200    0
  Peru                                                 1200    0
  Philippines                                             0    0
  Poland                                                  0    0
  Portugal                                                0    0
  Qatar                                                   0    0
  Republic of Korea                                    1200    0
  Romania                                                 0    0
  Russian Federation                                      0    0
  Rwanda                                                  0    0
  Sao Tome and Principe                                1196    0
  Senegal                                                 0    0
  Sierra Leone                                         1191    0
  Singapore                                              46    0
  Slovakia                                                0    0
  Slovenia                                                0    0
 [ reached getOption("max.print") -- omitted 24 rows ]
table(subset(merged,merged$cntry=="China")$survey,
      subset(merged,merged$cntry=="China")$year)
       
        1583 2000 2011 2012 2077
  asian    3    1 3408   60    1
  wvs      0    0    0 2300    0
merged$year[merged$cntry=="China" & merged$year == 1583] <- 2011
merged$year[merged$cntry=="China" & merged$year == 2000] <- 2011
merged$year[merged$cntry=="China" & merged$year == 2077] <- 2011
merged$year[merged$cntry=="China" & merged$year == 2012] <- 2011
table(subset(merged,merged$cntry=="Singapore")$survey,
      subset(merged,merged$cntry=="Singapore")$year)
       
        1582 2012 2014 2015
  asian 1000    0  993   46
  wvs      0 1972    0    0
merged$year[merged$cntry=="Singapore" & merged$year == 1582] <- 2011
hist(merged$gov_trust)

Level 2 Data

V-Dem

load(vdems_start_url)
vdems_sub <- vdems_start %>% filter(year %in% 2000:2010)
#tibble(id = 1:1896)
#table(vdems_sub$country_name)
vdem <- vdems_start %>%
  filter(year %in% 2000:2010) %>% 
  group_by(country_name) %>%
  tally %>%
  mutate(cntry = unique(country_name)) %>%
  #DCI Variables
  mutate(delib10 = vdems_sub %>%
           dcast(country_name ~ year, 
                 value.var=c("v2xdl_delib")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(consult10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2dlconslt")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(reason10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2dlreason")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(common10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2dlcommon")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(countr10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2dlcountr")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(engage10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2dlengage")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(delibdem10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2x_delibdem")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  # Control Variables
  mutate(polity10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_fh_ipolity2")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(gdp10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_GDP_Per_Cap_Haber_Men_2")) %>% #HIER MÜSSTE MAN 8 JAHRE GDP auswählen
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(riw10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_v2x_regime_ci")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(corecivil10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2xcs_ccsi")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(pop10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_mipopula")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(corruption10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2x_corr")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(polkill10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2x_clphy")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(educ10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_peaveduc")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(gini10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_peginiwi")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>% 
  # Dummy variables
  mutate(pol_round = round(polity10 * 2 -10)) %>% 
  mutate(polity_demdummy = ifelse(pol_round > 5, 1, 0)) %>% 
  mutate(polity_anodummy = ifelse(pol_round >= -5 & pol_round <= 5, 1, 0)) %>% 
  mutate(polity_autodummy = ifelse(pol_round < -5, 1, 0)) %>% 
  mutate(regime = case_when(
    polity_autodummy == 1 ~ "auto",
    polity_anodummy == 1 ~ "ano",
    polity_demdummy == 1 ~ "demo"
    )
  ) %>%
  mutate(regime = factor(regime, levels = c("demo", "ano", "auto"))) %>% 
  mutate(cntry = countrycode(cntry,"country.name.en","country.name.en"))
Some values were not matched unambiguously: Democratic Republic of Vietnam
vdem$cntry[40] <- "Viet Nam"
# ifelse(round(vdem$polity10 * 2 -10) >= -5 & round(vdem$polity10 * 2 -10) <= 5, 1, 0)
table(vdem$regime)

demo  ano auto 
  72   77   18 
print(levels(vdem$regime)) 
[1] "demo" "ano"  "auto"
  

To Do - Regions

  mutate(regions = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_regionpol")) %>%
           select('2000') %>% 
           mutate(regions = fct_recode(as.factor(`2000`),
                                "E. Europe and C. Asia (post-Communist)" = "1",
                                "Latin America & Carribean" = "2",
                                "MENA" = "3",
                                "Sub-Saharan Africa" = "4",
                                "W. Europe and N. America" = "5",
                                "South & East Asia & Pacific" = "6",
                                "South & East Asia & Pacific" = "7",
                                "South & East Asia & Pacific" = "8",
                                "South & East Asia & Pacific" = "9",
                                "Latin America & Carribean" = "10")  %>%
                                as_factor))  %>%
           select(regions)
Error in as_data_frame(data) : 
  argument ".data" is missing, with no default

QoG

load(qog_url)
qog10 <- qog %>% 
  filter(year %in% 2000:2010) %>% 
  mutate(cntry = countrycode(ccodecow, "cown","country.name.en"))
qog10 <- qog %>% 
  filter(year %in% 2000:2010) %>% 
  mutate(cntry = countrycode(ccodecow, "cown","country.name.en")) %>% 
  group_by(cntry) %>%
  tally() %>% 
  mutate(ethnic10 = qog10 %>%
           dcast(cntry ~ year, 
                 value.var=c("al_ethnic"), 
          fun.aggregate = mean) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>% 
  select(-n)
#  mutate(al_ethnic = as.numeric(al_ethnic)) %>% 
qog10

Merging Time

Level 2

level2 <- merge(x=qog10, y=vdem, by="cntry")
level2

Ind + Country

combined <- merge(x=merged, y=level2, by="cntry") %>% 
              mutate(cntryears = paste(cntry, year))
#combined$cntryears <- paste(combined$cntry,combined$year)
vdem2 <- vdems_start %>%
  filter(year %in% 2010:2015) %>% 
  mutate(cntry = countrycode(country_name,"country.name.en","country.name.en")) #%>% 
Some values were not matched unambiguously: Democratic Republic of Vietnam
 # select(cntry, country_name)
vdem2$cntry[996] <- "Viet Nam"
vdem2$cntry[997] <- "Viet Nam"
vdem2$cntry[998] <- "Viet Nam"
vdem2$cntry[999] <- "Viet Nam"
vdem2$cntry[1000] <- "Viet Nam"
vdem2$cntry[1001] <- "Viet Nam"
combined <- vdem2 %>% 
  mutate(cntryears = paste(cntry, year)) %>% 
  mutate(discuss_unsel = v2xcl_disc) %>% 
  select(cntryears, discuss_unsel) %>% 
  merge(combined, by = "cntryears") %>% 
                  plyr::ddply(~cntry,
                        summarise, 
                        discuss = mean(discuss_unsel, na.rm=T)) %>% 
  merge(combined, by = "cntry")
combined
save(combined,file="combined.Rdata")
save(level2,file="level2.Rdata")

Weighting

Macro Level

macro  <- combined %>% 
                mutate(gov_trust = range01(gov_trust)*100) %>% 
                mutate(demtoday = range01(demtoday)*100) %>% 
                plyr::ddply(~cntry,
                     summarise,
                     mean_gov = mean(gov_trust, na.rm=T),
                     mean_dem = mean(demtoday, na.rm=T),
                     discuss = mean(discuss, na.rm=T)) %>% 
#                     polity10 = mean(polity10, na.rm=T),
#                     polity_demdummy = mean(polity_demdummy, na.rm=T)) %>% 
                mutate(discuss_round = round(discuss*4)) %>% 
                mutate(mean_gov_low = case_when(
                      discuss_round == 2 ~ mean_gov * .9,
                      discuss_round == 1 ~ mean_gov * .85,
                      discuss_round %in% c(3,4) ~ mean_gov)) %>% 
                mutate(mean_gov_high = case_when(
                      discuss_round == 2 ~ mean_gov * .8,
                      discuss_round == 1 ~ mean_gov * .75,
                      discuss_round %in% c(3,4) ~ mean_gov)) %>% 
                merge(level2, by = "cntry") %>% 
                mutate_at(vars(common10, reason10, consult10, 
                 countr10, engage10, engage10, delib10), 
                                          range01)
macro_dem <- macro %>% 
                      filter(polity_demdummy == 1)
macro_aut <- macro %>% 
                      filter(polity_demdummy == 0)
# table_stuff2<-subset(table_stuff,
#                      !is.na(table_stuff$regime) &
#                        table_stuff$cntry!="Qatar" &
#                       table_stuff$cntry!="Uzbekistan")
save(macro, file="macro.Rdata")
save(macro_dem, file="macro_dem.Rdata")
save(macro_aut, file="macro_aut.Rdata")

Individual Level

Crap


compare_cntry<-data.frame(table(merged$cntry,merged$year))
compare_cntry<-tidyr::spread(compare_cntry,Var2,Freq)
compare_cntry[compare_cntry==0]<-100000
#compare_cntry<-na.omit(compare_cntry)
indie<-as.numeric(apply(compare_cntry[,-1],1,sum))
compare_cntry$double<-indie<900000
compare_cntry[compare_cntry==100000]<-0
compare_cntry2 <- subset(compare_cntry,compare_cntry$double==TRUE)

compare_cntry3 <- subset(merged,merged$cntry %in% compare_cntry2$Var1)

y1<-subset(compare_cntry3,compare_cntry3$cntry=="Belize" &
                      compare_cntry3$year==2012)$gov_trust

y2<-subset(compare_cntry3,compare_cntry3$cntry=="Belize" &
         compare_cntry3$year==2014)$gov_trust

t.test(y1,y2)

y1<-subset(compare_cntry3,compare_cntry3$cntry=="Bolivia (Plurinational State of)" &
             compare_cntry3$year==2012)$gov_trust

y2<-subset(compare_cntry3,compare_cntry3$cntry=="Bolivia (Plurinational State of)" &
             compare_cntry3$year==2013)$gov_trust

t.test(y1,y2)

y1<-subset(compare_cntry3,compare_cntry3$cntry=="South Africa" &
             compare_cntry3$year==2011)$gov_trust

y2<-subset(compare_cntry3,compare_cntry3$cntry=="South Africa" &
             compare_cntry3$year==2013)$gov_trust

t.test(y1,y2)

       
subset(merged,merged$year==2012)

library(dplyr)
compare_cntry4 <- compare_cntry3 %>%
  group_by(cntry,year) %>%
  summarise_all(funs(mean(., na.rm=TRUE)))

compare_cntry4$cntryear<-paste(compare_cntry4$cntry,compare_cntry4$year)
  
as.data.frame(compare_cntry4[,c(17,8)])
  
?ddply
head(afro)

afrocntry<-unique(afro$cntry)
latinocntry<-unique(latino2013$cntry)
arabcntry<-unique(arab3$cntry)
wvscntry<-unique(wvs$cntry)

cntry_table<- data.frame(as.character(wvscntry),
                         c(as.character(arabcntry),rep("-",48)),
                         c(as.character(latinocntry),rep("-",41)),
                         c(as.character(afrocntry),rep("-",24)))

colnames(cntry_table) <- c("wvs","arab","latino","afro")

arrange(cntry_table, wvs, afro)



table(combined$politcat.x)
mplusdata <- combined %>% dplyr::select(cntry, delib10, demtoday, 
                                        trust_gov, trust_parliament, 
                                        trust_police,trust_courts,weight)
mplusdata <- na.omit(mplusdata)
mplusdata$cntry <- as.numeric(mplusdata$cntry)
write_csv(mplusdata, path = "mplusdata.csv", col_names = F)

mplusdata2 <- combined %>% dplyr::select(cntry, delib10, demtoday, 
                                        gov_trust,weight)
mplusdata2 <- na.omit(mplusdata2)
mplusdata2$cntry <- as.numeric(mplusdata2$cntry)
write_csv(mplusdata2, path = "mplusdat2a.csv", col_names = F)

mplusdata2_dem <- combined_dem %>% dplyr::select(cntry, delib10, demtoday, 
                                         gov_trust,weight)
mplusdata2_dem <- na.omit(mplusdata2_dem)
mplusdata2_dem$cntry <- as.numeric(mplusdata2_dem$cntry)
write_csv(mplusdata2_dem, path = "mplusdat2_dema.csv", col_names = F)

mplusdata2_aut <- combined_aut %>% dplyr::select(cntry, delib10, demtoday, 
                                         gov_trust,weight)
mplusdata2_aut <- na.omit(mplusdata2_aut)
mplusdata2_aut$cntry <- as.numeric(mplusdata2_aut$cntry)
write_csv(mplusdata2_aut, path = "mplusdat2_auta.csv", col_names = F)

combined <- merge(combined, physi2_s, by = "cntry")

combined_dem <- subset(combined,combined$polity_demdummy==1)

mplusdata_dem <- combined_dem %>% dplyr::select(cntry, delib10, demtoday, 
                                        trust_gov, trust_parliament, 
                                        trust_police,trust_courts,weight)
mplusdata_dem <- na.omit(mplusdata_dem)
mplusdata_dem$cntry <- as.numeric(mplusdata_dem$cntry)
write_csv(mplusdata_dem, path = "mplusdata_dem.csv", col_names = F)


combined_aut <- subset(combined,combined$polity_demdummy==0)

mplusdata_aut <- combined_aut %>% dplyr::select(cntry, delib10, demtoday, 
                                                trust_gov, trust_parliament, 
                                                trust_police,trust_courts,weight)
mplusdata_aut <- na.omit(mplusdata_aut)
mplusdata_aut$cntry <- as.numeric(mplusdata_aut$cntry)
write_csv(mplusdata_aut, path = "mplusdata_aut.csv", col_names = F)


#data_wids <- dcast(merged, cntry~year, 
#                    value.var=c("year"))
#data_wids2 <- as.data.frame(lapply(data_wids[,-1],function(n) 0<n))
#data_wids3 <- as.data.frame(apply(data_wids2,2,as.numeric))
#data_wids3 <- cbind(data_wids[,1],data_wids3)
#names(data_wids3)[1]<-"cntry"
#table_stuff <- merge(data_wids3 ,table_stuff, by="cntry")

#table_stuff$polity10[table_stuff$cntry=="Tunisia"] <- 5.32382
#table_stuff2$polity10[table_stuff2$cntry=="Tunisia"] <- 5.32382

head(table_stuff)
cor(na.omit(data.frame(table_stuff$legit,table_stuff$legit2,table_stuff$legit3,
                       table_stuff$mean_gov)))

table_stuff$gni <- table_stuff$gni_c

table_stuff$gni_c[table_stuff$gni <= 1025] <- "low"
table_stuff$gni_c[table_stuff$gni > 1026 & table_stuff$gni <= 4035] <- "lower-middle"
table_stuff$gni_c[table_stuff$gni > 4036 & table_stuff$gni <= 12475] <- "upper-middle"
table_stuff$gni_c[table_stuff$gni > 12475] <- "high"

table_stuff$gni_c2 <- table_stuff$gni_c

table_stuff$gni_c2[table_stuff$gni_c == "lower-middle"] <- "low"
table_stuff$gni_c2[table_stuff$gni_c == "upper-middle"] <- "high"

table(table_stuff$gni_c)
table(table_stuff$gni_c2)

The cut-off points are HDI of less than 0.550
for low human development, 0.550-0.699 for medium human
development, 0.700-0.799 for high human development and
0.800 or greater for very high human development.

#table_stuff$hdi_c <- table_stuff$hdi

#table_stuff$hdi_c[table_stuff$hdi < 0.550] <- "low"
#table_stuff$hdi_c[table_stuff$hdi >= 0.550 & table_stuff$hdi <= 0.699] <- "medium"
#table_stuff$hdi_c[table_stuff$hdi >= 0.700 & table_stuff$hdi <= 0.899] <- "high"
#table_stuff$hdi_c[table_stuff$hdi >= 0.90] <- "very high"

#table(table_stuff$hdi_c)



table(round(table_stuff$terror))

table_stuff$mean_gov2 <- table_stuff$mean_gov
table_stuff$mean_gov2[is.na(table_stuff$mean_gov2)]<-999

table_stuff$mean_gov3 <- table_stuff$mean_gov
table_stuff$mean_gov3[is.na(table_stuff$mean_gov3)]<-999

table_stuff$mean_gov4 <- table_stuff$mean_gov
table_stuff$mean_gov4[is.na(table_stuff$mean_gov4)]<-999

table_stuff$mean_gov5 <- table_stuff$mean_gov
table_stuff$mean_gov5[is.na(table_stuff$mean_gov5)]<-999

table_stuff$mean_gov6 <- table_stuff$mean_gov
table_stuff$mean_gov6[is.na(table_stuff$mean_gov6)]<-999

table_stuff$mean_gov7 <- table_stuff$mean_gov
table_stuff$mean_gov7[is.na(table_stuff$mean_gov7)]<-999

table_stuff$mean_gov8 <- table_stuff$mean_gov
table_stuff$mean_gov8[is.na(table_stuff$mean_gov8)]<-999

table_stuff$mean_gov9 <- table_stuff$mean_gov
table_stuff$mean_gov9[is.na(table_stuff$mean_gov9)]<-999

table_stuff$physviol2 <- table_stuff$physviol
table_stuff$physviol2[is.na(table_stuff$physviol2)] <- 999

table_stuff$terror2 <- round(table_stuff$terror)
table_stuff$terror2[is.nan(table_stuff$terror2)] <- 999

table_stuff$discuss2 <- round(table_stuff$discuss*4)
table_stuff$discuss2[is.nan(table_stuff$discuss2)] <- 999



table(table_stuff$physviol)
table_stuff$mean_gov2[table_stuff$physviol2<=0.5 & table_stuff$physviol2>0.4] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.5 & table_stuff$physviol2>0.4]-5
table_stuff$mean_gov2[table_stuff$physviol2<=0.4 & table_stuff$physviol2>0.3] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.4 & table_stuff$physviol2>0.3]-10
table_stuff$mean_gov2[table_stuff$physviol2<=0.3 & table_stuff$physviol2>0.2] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.3 & table_stuff$physviol2>0.2]-15
table_stuff$mean_gov2[table_stuff$physviol2<=0.2 & table_stuff$physviol2>0.1] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.2 & table_stuff$physviol2>0.1]-20
table_stuff$mean_gov2[table_stuff$physviol2<=0.1 & table_stuff$physviol2>=0]  <- table_stuff$mean_gov2[table_stuff$physviol2<=0.1 & table_stuff$physviol2>=0]  -25

table_stuff$mean_gov2[table_stuff$mean_gov2>100] <- NA
table(table_stuff$mean_gov2)

table_stuff$mean_gov3[table_stuff$physviol2<=0.5 & table_stuff$physviol2>0.4] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.5 & table_stuff$physviol2>0.4]-8
table_stuff$mean_gov3[table_stuff$physviol2<=0.4 & table_stuff$physviol2>0.3] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.4 & table_stuff$physviol2>0.3]-16
table_stuff$mean_gov3[table_stuff$physviol2<=0.3 & table_stuff$physviol2>0.2] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.3 & table_stuff$physviol2>0.2]-24
table_stuff$mean_gov3[table_stuff$physviol2<=0.2 & table_stuff$physviol2>0.1] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.2 & table_stuff$physviol2>0.1] -32
table_stuff$mean_gov3[table_stuff$physviol2<=0.1 & table_stuff$physviol2>=0] <-  table_stuff$mean_gov3[table_stuff$physviol2<=0.1 & table_stuff$physviol2>=0]  -30

table_stuff$mean_gov3[table_stuff$mean_gov3>100] <- NA
table(table_stuff$mean_gov3)

table_stuff$mean_gov4[table_stuff$terror2==5] <- table_stuff$mean_gov4[table_stuff$terror2==5]-5
table_stuff$mean_gov4[table_stuff$terror2==4] <- table_stuff$mean_gov4[table_stuff$terror2==4]-10
table_stuff$mean_gov4[table_stuff$terror2==3] <- table_stuff$mean_gov4[table_stuff$terror2==3]-15

table_stuff$mean_gov4[table_stuff$mean_gov4>100] <- NA
table(table_stuff$mean_gov4)

table_stuff$mean_gov5[table_stuff$terror2==5] <- table_stuff$mean_gov5[table_stuff$terror2==5]-8
table_stuff$mean_gov5[table_stuff$terror2==4] <- table_stuff$mean_gov5[table_stuff$terror2==4]-16
table_stuff$mean_gov5[table_stuff$terror2==3] <- table_stuff$mean_gov5[table_stuff$terror2==3]-24

table_stuff$mean_gov5[table_stuff$mean_gov5>100] <- NA
table(table_stuff$mean_gov5)

table_stuff$mean_gov6[table_stuff$discuss2==2] <- table_stuff$mean_gov6[table_stuff$discuss2==2] -5
table_stuff$mean_gov6[table_stuff$discuss2==1] <- table_stuff$mean_gov6[table_stuff$discuss2==1] -10

table_stuff$mean_gov6[table_stuff$mean_gov6>100] <- NA
table(table_stuff$mean_gov6)

table_stuff$mean_gov7[table_stuff$discuss2==2] <- table_stuff$mean_gov7[table_stuff$discuss2==2] -10
table_stuff$mean_gov7[table_stuff$discuss2==1] <- table_stuff$mean_gov7[table_stuff$discuss2==1] -20

table_stuff$mean_gov7[table_stuff$mean_gov7>100] <- NA
table(table_stuff$mean_gov7)


load(qog_url)

qog10 <- subset(qog,qog$year==2000 |
                  qog$year==2001 |  
                  qog$year==2002 | 
                  qog$year==2003 | 
                  qog$year==2004 | 
                  qog$year==2005 | 
                  qog$year==2006 | 
                  qog$year==2007 | 
                  qog$year==2008 | 
                  qog$year==2009 |
                  qog$year==2010)

library(countrycode)
qog10$cntry<-countrycode(qog10$ccodecow, "cown","country.name.en")
qog10$al_ethnic<-as.numeric(qog10$al_ethnic)
#tidyr::gather(qog10,c("cntry","year"),"al_ethnic")

qog10a <- qog10 %>% dplyr::select(cntry,year,al_ethnic) %>%
  as.data.frame()
data_wide17 <- reshape(data = qog10a,
                       idvar = "cntry",
                       v.names = "al_ethnic",
                       timevar = "year",
                       direction = "wide")

#qog10hdi <- qog10 %>% dplyr::select(cntry,year,undp_hdi) %>%
#  as.data.frame()
#data_wide_hdi <- hdi
  #reshape(data = qog10hdi,
                      # idvar = "cntry",
                      # v.names = "undp_hdi",
                      # timevar = "year",
                      # direction = "wide")



table(qog$al_ethnic,qog$year)

qog14 <- subset(qog,qog$year==2014)
qog14$cntry<-countrycode(qog14$ccodecow, "cown","country.name.en")
qog14 <- qog14 %>% dplyr::select(cntry,year,cspf_legit) %>%
  as.data.frame()
data_wide18 <- reshape(data = qog14,
                       idvar = "cntry",
                       v.names = "cspf_legit",
                       timevar = "year",
                       direction = "wide")

qog15 <- subset(qog,qog$year==2015)
qog15$cntry<-countrycode(qog15$ccodecow, "cown","country.name.en")
qog15 <- qog15 %>% dplyr::select(cntry,year,ffp_sl) %>%
  as.data.frame()
data_wide19 <- reshape(data = qog15,
                       idvar = "cntry",
                       v.names = "ffp_sl",
                       timevar = "year",
                       direction = "wide")


qog10$ciri_physint<-as.numeric(qog10$ciri_physint)
qog10a <- qog10 %>% dplyr::select(cntry,year,ciri_physint) %>%
  as.data.frame()
data_wide20 <- reshape(data = qog10a,
                       idvar = "cntry",
                       v.names = "ciri_physint",
                       timevar = "year",
                       direction = "wide")

qog10$gd_ptss <-as.numeric(qog10$gd_ptss)
qog10a <- qog10 %>% dplyr::select(cntry,year,gd_ptss) %>%
  as.data.frame()
data_wide21 <- reshape(data = qog10a,
                       idvar = "cntry",
                       v.names = "gd_ptss",
                       timevar = "year",
                       direction = "wide")

qog14<-subset(qog,qog$year==2014)
qog13<-subset(qog,qog$year==2013)
qog12<-subset(qog,qog$year==2012)
qog11<-subset(qog,qog$year==2011)
qog10<-subset(qog,qog$year==2010)
qog8<-subset(qog,qog$year==2008)
qog7<-subset(qog,qog$year==2007)
qog6<-subset(qog,qog$year==2006)
qog5<-subset(qog,qog$year==2005)
qog4<-subset(qog,qog$year==2004)
qog3<-subset(qog,qog$year==2003)
qog2<-subset(qog,qog$year==2002)
qog1<-subset(qog,qog$year==2001)
qog0<-subset(qog,qog$year==2000)



table(is.na(qog$wel_culture),qog$year)
culreg<- pmax(qog14$wel_culture, qog13$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog12$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog11$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog10$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog8$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog7$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog6$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog5$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog4$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog3$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog2$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog1$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog0$wel_culture, na.rm = TRUE)
culreg<- as.character(sjmisc::to_label(culreg))
culreg<-as.data.frame(cbind(culreg,qog14$ccodecow))
oreast  <- subset(culreg, culreg$culreg == "Orthodox East")
oreast

#culreg<- pmax(culreg, qog10$wel_culture, na.rm = TRUE)

qog14$ht_region 

culreg$cntry<-countrycode(culreg$V2, "cown","country.name.en")
tabeletto<-merge(table_stuff,culreg,by="cntry")
tabeletto<-as.data.frame(cbind(table_stuff$regions,
                               as.character(table_stuff$cntry),
                               as.character(tabeletto$culreg)))
tabeletto <- tabeletto[order(tabeletto$V1, tabeletto$V3),]
#edit(tabeletto)

culreg<-data.frame(cbind(tabeletto,culreg))
culreg<-culreg[,c(2,4)]
names(culreg)[1]<-c("cntry")

table_stuff3 <- merge(table_stuff,culreg,by="cntry")

table(as.character(tabeletto$V3))

qog100 <- subset(qog,qog$year==2010)
qog100$cntry<-countrycode(sjmisc::to_label(qog100$ccodecow), "cown","country.name.en")
qog100 <- qog100 %>% dplyr::select(cntry,year,ht_regtype1) %>%
  as.data.frame()
qog100$regtype<-sjmisc::to_label(qog100$ht_regtype1)
qog100$year <- NULL
qog100$ht_regtype1 <- NULL
table(qog100$regtype)


ethnic10<-as.numeric(rowMeans(data_wide17[,2:12])) # mean over last 10 years (2000 - 2010)
physint10<-as.numeric(rowMeans(data_wide20[,2:12])) # mean over last 10 years (2000 - 2010)
terror10<-as.numeric(rowMeans(data_wide21[,2:12])) # mean over last 10 years (2000 - 2010)
legit<-as.numeric(data_wide18[,2]) # mean over last 10 years (2000 - 2010)
legit2<-as.numeric(data_wide19[,2]) # mean over last 10 years (2000 - 2010)
qogthingy<-data.frame(data_wide19[,1],ethnic10,legit,legit2,physint10,terror10)
colnames(qogthingy)[1]<-c("cntry")
qogthingy<-merge(x=qogthingy, y=qog100, by="cntry")

#qogthingy<-data.frame(data_wide17[,1],ethnic10)
#colnames(qogthingy)[1]<-c("cntry")
#combined <- merge(x=qogthingy, y=combined, by="cntry")


qog_cs <-read_spss("C:/Users/Favone/Downloads/qog_std_cs_jan17.sav") #loading dataset
qog_cs$cntry<-countrycode(qog_cs$ccodecow, "cown","country.name.en")
qog_cs$legit3<-as.numeric(qog_cs$gov_ixlegitimacyindex)

legit_dat<-data.frame(qog_cs$cntry,qog_cs$legit3)
colnames(legit_dat)<-c("cntry","legit3")

aggrdelib <- merge(x=legit_dat, y=aggrdelib, by="cntry")

aggrdelib$legit3 <- range01(aggrdelib$legit3)
cor(na.omit(aggrdelib[,c(4,5,7,13)]))
cor(na.omit(aggrdelib[,c(4,5,2,6:13)]))

aggrdelib$legit <- 1-range01(aggrdelib$legit)
aggrdelib$legit2 <- 1-range01(aggrdelib$legit2)
aggrdelib$asia <- aggrdelib$e.asia + aggrdelib$s.e.asia + aggrdelib$s.asia + aggrdelib$pacific

SFI <-read_spss("C:/Users/Favone/Downloads/SFIv2016.sav") #loading dataset
SFI <- subset(SFI,SFI$year==2015)
SFI$cntry <-countrycode(SFI$country, "country.name.en","country.name.en") 
SFI$cntry[79] <- "North Korea"
SFI$cntry <-countrycode(SFI$cntry, "country.name.en","country.name.en") 
SFI$legitimacy <- SFI$legit
SFI$legit <- NULL


aggrdelib <- merge(x=SFI, y=aggrdelib, by="cntry")

hdi <- read_csv("hdi.csv")
hdi$cntry<-countrycode(hdi$Country, "country.name.en","country.name.en")
hdi$'1990'<- NULL ; hdi$'1991'<- NULL ; hdi$'1992'<- NULL ; hdi$'1993'<- NULL
hdi$'1994'<- NULL; hdi$'1995'<- NULL; hdi$'1996'<- NULL; hdi$'1997'<- NULL
hdi$'1998'<- NULL ; hdi$'1999'<- NULL ; hdi$'2011'<- NULL ; hdi$'2012'<- NULL
hdi$'2013'<- NULL; hdi$'2014'<- NULL; hdi$'2015'<- NULL;hdi$`HDI Rank (2015)`<- NULL
hdi$Country<- NULL
hdi10<-as.numeric(rowMeans(hdi[,1:11])) 
hdat<-data.frame(hdi$cntry,hdi10) 
names(hdat)<-c("cntry","hdi10")

aggrdelib <- merge(x=hdat, y=aggrdelib, by="cntry")
#table(aggrdelib$hdi10)
#gc()
#combined <- merge(x=hdat, y=combined, by="cntry")


#colnames(aggrdelib)[9]<-"e_p_polity"
#lop<-subset(vdems_start,vdems_start$year==2010)

cor(na.omit(aggrdelib2[,2:17]))
cor(na.omit(data.frame(aggrdelib$polity10,aggrdelib$delib10)))

#hist(vdems$v2dlconslt)
#hist(vdems$v2xcl_disc)
#table(vdems_start$e_boix_regime,vdems_start$year)
#table(vdems_sub$e_p_polity,vdems_sub$year)

##### merging time ####

combined <- merge(x=merged, y=aggrdelib, by="cntry")
table(combined$cntry)

combined <- as.data.frame(combined)
combined$gov_trust <- as.numeric(combined$gov_trust)
combined$age <- as.numeric(combined$age)
combined$income <- as.numeric(combined$income)
combined$educ <- as.numeric(combined$educ)
combined$sex <- as.factor(combined$sex)
combined$authoritarian <- as.numeric(combined$authoritarian)
combined$safety <- as.numeric(combined$safety)
combined$demtoday <- as.numeric(combined$demtoday)
combined$latino <- factor(combined$latino)
combined$afro <- factor(combined$afro)
combined$americas <- factor(combined$americas)
combined$asia <- combined$e.asia + combined$s.e.asia + combined$s.asia + combined$pacific

cor(na.omit(data.frame(combined$gov_trust,combined$income,combined$educ, #Socioeconomic factors
                       combined$delib10, combined$polity10, combined$gdp10, combined$demtoday)))

combined$cntry<-as.factor(combined$cntry)


#combined$polity10 <- combined$polity10*20-10

#combined$regime <- combined$polity10
#combined$regime[combined$polity_autodummy==1] <- "auto"
#combined$regime[combined$polity_anodummy==1] <- "ano"
#combined$regime[combined$polity_demdummy==1] <- "demo"

hist(combined$gov_trust)
qplot(combined$gov_trust)

combined$cntry



#physi_s <- vdems_sub2 %>% dplyr::select(cntryears, franz)

#combined <- merge(combined, physi_s, by = "cntryears")

#physi2_s <- ddply(combined,~cntry,
#                summarise,politcat=mean(franz,na.rm=T))

#combined <- merge(combined, physi2_s, by = "cntry")


vdems_sub2$cntryears <- paste(vdems_sub2$cntry,vdems_sub2$year)

physi <- vdems_sub2 %>% dplyr::select(cntryears, perc)

combined <- merge(combined, physi, by = "cntryears")

physi2 <- ddply(combined,~cntry,
                     summarise,physviol=mean(perc,na.rm=T))

combined <- merge(combined, physi2, by = "cntry")





#physi_22$dis3 <-round(physi_22$dis2)

#unique(physi2_s$cntry)

#1-2.5
#3-5
#5.5 - 7
#physi2_s$politcat2<-8-((physi2_s$politcat) * (7/10))
#11 

#physi2_s$polity_demdummy <- physi2_s$politcat2
#physi2_s$polity_demdummy [physi2_s$politcat2 <= 2.5] <- 1
#physi2_s$polity_demdummy [physi2_s$politcat2 >  2.5] <- 0
#table(physi2_s$polity_demdummy)

#physi2_s$polity_anodummy <- physi2_s$politcat2
#physi2_s$polity_anodummy[physi2_s$politcat2 > 2.5 & physi2_s$politcat2 < 5.5] <- 1
#physi2_s$polity_anodummy[physi2_s$politcat2 <= 2.5 | physi2_s$politcat2 >= 5.5] <- 0
#table(physi2_s$polity_anodummy)

#physi2_s$polity_autodummy <- physi2_s$politcat2
#physi2_s$polity_autodummy[physi2_s$politcat2 >= 5.5] <- 1
#physi2_s$polity_autodummy[physi2_s$politcat2 < 5.5] <- 0
#table(physi2_s$polity_autodummy)

#physi2_s$regime <- physi2_s$politcat
#physi2_s$regime[physi2_s$polity_autodummy==1] <- "auto"
#physi2_s$regime[physi2_s$polity_anodummy==1] <- "ano"
#physi2_s$regime[physi2_s$polity_demdummy==1] <- "demo"

#unique(physi2_s$cntry)

table(physi2_s$regime)

qog2000 <- subset(qog,qog$year==2010 |
                       qog$year==2011 |  
                       qog$year==2012 | 
                       qog$year==2013 | 
                       qog$year==2014 | 
                       qog$year==2015)

table(qog2000$gd_ptsa,qog2000$year)

qog2000$perc2 <- qog2000$gd_ptsa

qog2000$cntry<-countrycode(qog2000$ccodecow, "cown","country.name.en")

qog2000$cntryears <- paste(qog2000$cntry,qog2000$year)

physi2000 <- qog2000 %>% dplyr::select(cntryears, perc2)

combined <- merge(combined, physi2000, by = "cntryears")

physi22000 <- ddply(combined,~cntry,
                summarise,terror=mean(perc2,na.rm=T))

combined <- merge(combined, physi22000, by = "cntry")

#table(qog2000$undp_hdi,qog2000$year)

#physiff <- qog2000 %>% dplyr::select(cntryears, undp_hdi)

#combined <- merge(combined, physiff, by = "cntryears")

#physiff2 <- ddply(combined,~cntry,
#                    summarise,hdi=mean(undp_hdi,na.rm=T))

#combined <- merge(combined, physiff2, by = "cntry")


gni <- read_csv("GNI.csv",  skip = 1)

gni$`2015`<-gsub("ttt","",gni$`2015`)
gni$`2015`<-gsub("ff","",gni$`2015`)
gni$`2015`<-gsub("sss","",gni$`2015`)
gni$`2015`<-gsub("uuu","",gni$`2015`)
gni$`2015`<-gsub("o","",gni$`2015`)
gni$`2015` <- as.numeric(gni$`2015`)

gni$`2014`<-gsub("ttt","",gni$`2014`)
gni$`2014`<-gsub("ff","",gni$`2014`)
gni$`2014`<-gsub("sss","",gni$`2014`)
gni$`2014`<-gsub("uuu","",gni$`2014`)
gni$`2014`<-gsub("o","",gni$`2014`)
gni$`2014` <- as.numeric(gni$`2014`)

gni<-gni[,c(2,23:28)]

gni<-gather(as.data.frame(gni),key = "Country")
names(gni) <- c("cntry","year","gni")

gni$cntry<-countrycode(gni$cntry,"country.name.en","country.name.en")
gni$cntryears <- paste(gni$cntry,gni$year)

physigni <- gni %>% dplyr::select(cntryears, gni)

combined <- merge(combined, physigni, by = "cntryears")

physigni2 <- ddply(combined,~cntry,
                    summarise,gni_c=mean(gni,na.rm=T))

combined <- merge(combined, physigni2, by = "cntry")
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIExvYWRpbmcgdGhlIFBhY2thZ2VzDQoNCmBgYHtyfQ0KbGlicmFyeShwYWNtYW4pDQoNCiNwX2luc3RhbGxfZ2goImZhdnN0YXRzL2ZhdnN0YXRzIikNCnBfbG9hZCh0aWR5dmVyc2UsIGhhdmVuLHNqbWlzYywNCiAgICAgICAgICAgICAgICAgICAgIGZvcmNhdHMsIHdlaWdodHMsIGNhciwNCiAgICAgICAgICAgICAgICAgICAgIGNvdW50cnljb2RlLCBsYXZhYW4sDQogICAgICAgICAgICAgICAgICAgICBzZW1Ub29scywgbGF2YWFuLnN1cnZleSwNCiAgICAgICAgICAgICAgICAgICAgIHN1cnZleSwgcmVzaGFwZTIsIGZhdnN0YXRzLA0KICAgICAgICAgICAgICAgICAgICAgbWFncml0dHIpDQpgYGANCg0KIyBMb2FkaW5nIHRoZSBVUkxzDQoNCmBgYHtyfQ0KYWZybzVfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL2Fmcm81LlJEYXRhIikNCmFmcm82X3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9hZnJvNi5SRGF0YSIpDQoNCmxhdGlubzIwMTNfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL2xhdGlubzIwMTMuUkRhdGEiKQ0KbGF0aW5vMjAxNV91cmwgPC0gdXJsKCJodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvbGF0aW5vMjAxNS5SRGF0YSIpDQoNCnd2c19yYXdfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL3d2c19yYXcuUkRhdGEiKQ0KDQphbWVyaWNhc191cmwgPC0gdXJsKCJodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvYW1lcmljYXMuUkRhdGEiKQ0KYm9saXZpYV91cmwgPC0gdXJsKCJodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvYm9saXZpYS5SRGF0YSIpDQpjYW5hZGFfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL2NhbmFkYS5SRGF0YSIpDQoNCmFzaWFuX3Jhd191cmwgPC0gdXJsKCJodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvYXNpYW5fcmF3LlJEYXRhIikNCm15YW5tYXJfcmF3X3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9teWFubWFyX3Jhdy5SRGF0YSIpDQptb25nb2xpYV9yYXdfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL21vbmdvbGlhX3Jhdy5SRGF0YSIpDQpwaGlsaXBfcmF3X3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9waGlsaXBfcmF3LlJEYXRhIikNCnRhaXdhbl9yYXdfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL3RhaXdhbl9yYXcuUkRhdGEiKQ0KdGhhaV9yYXdfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL3RoYWlfcmF3LlJEYXRhIikNCm1hbGF5X3Jhd191cmwgPC0gdXJsKCJodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvbWFsYXlfcmF3LlJEYXRhIikNCnNpbmdhcG9yZV9yYXdfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL3NpbmdhcG9yZV9yYXcuUkRhdGEiKQ0Kc2tfcmF3X3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9za19yYXcuUkRhdGEiKQ0KY2FtYm9kaWFfcmF3X3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9jYW1ib2RpYV9yYXcuUkRhdGEiKQ0KDQpFU1NfcmF3X3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9ibG9iL21hc3Rlci9FU1NfcmF3LlJkYXRhP3Jhdz10cnVlIikNCg0KdmRlbXNfc3RhcnRfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL3ZkZW1zX3N0YXJ0LlJkYXRhIikNCg0KcW9nX3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9xb2cuUmRhdGEiKQ0KDQpgYGANCg0KDQojIEFmcm9iYXJvbWV0ZXIgRGF0YQ0KDQojIyBBZnJvIDUNCg0KYGBge3J9DQpsb2FkKGFmcm81X3VybCkNCg0KZGVsZXRlX25hX2Fmcm8gPC0gZnVuY3Rpb24oeCkgew0KICB4IDwtIFJlY29kZSh4LCAiOSA9IE5BOw0KICAgICAgICAgICAgOTggPSBOQTsNCiAgICAgICAgICAgIDk5ID0gTkE7DQogICAgICAgICAgICAtMSA9IE5BIikNCiAgcmV0dXJuKHgpDQp9ICMgRnVua3Rpb24gdW0gZGllIE5BcyBpbSBBZnJvIERhdGVuc2F0eiB6dSBiZXN0aW1tZW4NCg0KIyBhbGxlIFZhcmlhYmxlbg0KYWZyb181IDwtIGFmcm81ICU+JQ0KICByZW5hbWUoDQogICAgZWR1YyA9IFE5NywgIyBWYXJpYWJsZW4gdW1iZW5lbm5lbg0KICAgIGluY29tZSA9IFEzQiwNCiAgICBzZXggPSBRMTAxLA0KICAgIHdvcmsgPSBROTYsDQogICAgdHJ1c3RfZ292ID0gUTU5QSwNCiAgICB0cnVzdF9wYXJsaWFtZW50ID0gUTU5QiwNCiAgICB0cnVzdF9wb2xpY2UgPSBRNTlILA0KICAgIHRydXN0X2NvdXJ0cyA9IFE1OUosDQogICAgZGVtdG9kYXkgPSBRNDZBDQogICkgJT4lDQogIG11dGF0ZV9hdCgNCiAgICB2YXJzKA0KICAgICAgaW5jb21lLCB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cywgd29yaw0KICAgICksDQogICAgZGVsZXRlX25hX2Fmcm8NCiAgKSAlPiUgIyBOQXMgZGVsZXRlbg0KICBtdXRhdGUoDQogICAgc2V4ID0gc2V4IC0gMSwgIyBzZXggKDAvMSkgY29kaWVyZW4NCiAgICB3b3JrID0gUmVjb2RlKA0KICAgICAgd29yaywgIyB3b3JrICgwLzEpIGNvZGllcmVuDQogICAgICAiMSA9IDA7DQogICAgICAgMiA9IDE7DQogICAgICAgMyA9IDEiDQogICAgKSwNCiAgICBhZ2UgPSBSZWNvZGUoDQogICAgICBRMSwgIyBtaXNzaW5nIHZhbHVlcyBsP3NjaGVuDQogICAgICAiLTEgPSBOQTsNCiAgICAgIDk5OCA9IE5BOw0KICAgICAgOTk5ID0gTkEiDQogICAgKSwNCiAgICBkZW10b2RheSA9IFJlY29kZSgNCiAgICAgIGRlbXRvZGF5LA0KICAgICAgIi0xID0gTkE7DQogICAgICAgOTggPSBOQTsNCiAgICAgICA5OSA9IE5BIg0KICAgICksDQogICAgZWR1YyA9IFJlY29kZSgNCiAgICAgIGVkdWMsDQogICAgICAiLTEgPSBOQTsNCiAgICAgICA5OCA9IE5BOw0KICAgICAgIDk5ID0gTkE7DQogICAgICA5OTkgPSBOQSINCiAgICApLA0KICAgIGNudHJ5ID0gdG9fbGFiZWwoQ09VTlRSWV9BTFBIQSksDQogICAgeWVhciA9IGFzLm51bWVyaWMoZm9ybWF0KERBVEVJTlRSLCAiJVkiKSkNCiAgKSAlPiUNCiAgc2VsZWN0KA0KICAgIGNudHJ5LCB5ZWFyLCBhZ2UsIHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCBkZW10b2RheSwgDQogICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICApDQoNCmFmcm9fNQ0KYGBgDQoNCiMjIEFmcm8gNg0KDQpgYGB7cn0NCmxvYWQoYWZybzZfdXJsKQ0KDQphZnJvXzYgPC0gYWZybzYgJT4lDQogIHJlbmFtZSgNCiAgICBlZHVjID0gUTk3LA0KICAgIGluY29tZSA9IFE0QiwNCiAgICBzZXggPSBRMTAxLA0KICAgIHdvcmsgPSBROTUsDQogICAgdHJ1c3RfZ292ID0gUTUyQSwNCiAgICB0cnVzdF9wYXJsaWFtZW50ID0gUTUyQiwNCiAgICB0cnVzdF9wb2xpY2UgPSBRNTJILA0KICAgIHRydXN0X2NvdXJ0cyA9IFE1MkosDQogICAgZGVtdG9kYXkgPSBRNDANCiAgKSAlPiUNCiAgbXV0YXRlX2F0KA0KICAgIHZhcnMoDQogICAgICBpbmNvbWUsIGRlbXRvZGF5LCB0cnVzdF9nb3YsDQogICAgICB0cnVzdF9wYXJsaWFtZW50LCB0cnVzdF9wb2xpY2UsDQogICAgICB0cnVzdF9jb3VydHMsIHdvcmsNCiAgICApLA0KICAgIGRlbGV0ZV9uYV9hZnJvDQogICkgJT4lICMgTkFzIGRlbGV0ZW4NCiAgbXV0YXRlKA0KICAgIHNleCA9IHNleCAtIDEsICMgc2V4ICgwLzEpIGNvZGllcmVuDQogICAgd29yayA9IFJlY29kZSgNCiAgICAgIHdvcmssICMgd29yayAoMC8xKSBjb2RpZXJlbg0KICAgICAgIjEgPSAwOw0KICAgICAgIDIgPSAxOw0KICAgICAgIDMgPSAxIg0KICAgICksDQogICAgYWdlID0gUmVjb2RlKA0KICAgICAgUTEsICMgbWlzc2luZyB2YWx1ZXMgbD9zY2hlbg0KICAgICAgIi0xID0gTkE7DQogICAgICA5OTggPSBOQTsNCiAgICAgIDk5OSA9IE5BIg0KICAgICksDQogICAgZWR1YyA9IFJlY29kZSgNCiAgICAgIGVkdWMsDQogICAgICAiLTEgPSBOQTsNCiAgICAgICA5OCA9IE5BOw0KICAgICAgIDk5ID0gTkE7DQogICAgICA5OTkgPSBOQSINCiAgICApLA0KICAgIGRlbXRvZGF5ID0gUmVjb2RlKA0KICAgICAgZGVtdG9kYXksDQogICAgICAiOCA9IE5BIg0KICAgICksDQogICAgY250cnkgPSB0b19sYWJlbChDT1VOVFJZX1I1TGlzdCksDQogICAgeWVhciA9IGFzLm51bWVyaWMoZm9ybWF0KERBVEVJTlRSLCAiJVkiKSkNCiAgKSAlPiUNCiAgIyAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCBkZW10b2RheSwgZWR1YywgYWdlLA0KICAjICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICMgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwNCiAgIyAgICAgICAgICAgIGFzLmNoYXJhY3RlcikgJT4lDQogICMgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIGFnZSwNCiAgIyAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAjICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksDQogICMgICAgICAgICAgICBhcy5udW1lcmljKSAlPiUNCiAgc2VsZWN0KA0KICAgIGNudHJ5LCB5ZWFyLCBhZ2UsIHNleCwgaW5jb21lLA0KICAgIGVkdWMsIHdvcmssIGRlbXRvZGF5LA0KICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICApIA0KDQphZnJvXzYNCg0KYGBgDQoNCiMjIE1lcmdpbmcgdGhlIERhdGENCg0KYGBge3J9DQphZnJvX3JlYWwgPC0gYWZyb181ICU+JSANCiAgbXV0YXRlX2F0KA0KICAgIHZhcnMoDQogICAgICBpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLA0KICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICApLA0KICAgIHJhbmdlMDENCiAgKQ0KDQphZnJvX3JlYWwyIDwtIGFmcm9fNiAlPiUgDQogIG11dGF0ZV9hdCgNCiAgICB2YXJzKA0KICAgICAgaW5jb21lLCBkZW10b2RheSwgZWR1YywNCiAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICAgKSwNCiAgICByYW5nZTAxDQogICkNCiMgbGVuZ3RoKHVuaXF1ZShhZnJvX3JlYWwkY250cnkpKQ0KIyBsZW5ndGgodW5pcXVlKGFmcm9fcmVhbDIkY250cnkpKQ0KIyB0YWJsZShhZnJvX3JlYWwyJHllYXIpDQoNCmFmcm8gPC0gcmJpbmQoYWZyb19yZWFsLCBhZnJvX3JlYWwyKSAlPiUgYXMudGJsKCkNCg0KYWZybw0KYGBgDQoNCiMgTGF0aW5vIEJhcm9tZXRybw0KDQojIyBMYXRpbm8gMjAxMw0KDQpgYGB7cn0NCmxvYWQobGF0aW5vMjAxM191cmwpDQoNCmxhdGlub18yMDEzIDwtIGxhdGlubzIwMTMgJT4lDQogIHJlbmFtZSgNCiAgICBlZHVjID0gUkVFRFVDXzEsDQogICAgaW5jb21lID0gUzYsDQogICAgZGVtdG9kYXkgPSBQNTBUR0IuQSwNCiAgICBhZ2UgPSBTMTENCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIHNleCA9IFMxMCAtIDEsICMgc2V4IHZhcmlhYmxlIGVyc3RlbGxlbg0KICAgIGNudHJ5ID0gdG9fbGFiZWwoSURFTlBBKSwgIyBjbnRyeSB2YXJpYWJsZSBlcnN0ZWxsZW4NCiAgICB0cnVzdF9nb3YgPSA1IC0gUDI2VEdCLkIsDQogICAgdHJ1c3RfcGFybGlhbWVudCA9IDUgLSBQMjZUR0IuQywNCiAgICB0cnVzdF9wb2xpY2UgPSA1IC0gUDI4VEdCLkIsDQogICAgdHJ1c3RfY291cnRzID0gNSAtIFAyNlRHQi5FLA0KICAgIHllYXIgPSAyMDEzLA0KICAgIGluY29tZSA9IDUgLSBpbmNvbWUsDQogICAgd29yayA9IFJlY29kZSgNCiAgICAgIFMxOS5BLA0KICAgICAgIjIgPSAxOw0KICAgICAgIDMgPSAxOw0KICAgICAgIDQgPSAwOw0KICAgICAgIDUgPSAwOw0KICAgICAgIDYgPSAwOw0KICAgICAgIDcgPSAwIg0KICAgICkNCiAgKSAlPiUNCiAgc2VsZWN0KA0KICAgIGNudHJ5LCB5ZWFyLCBhZ2UsIHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCBkZW10b2RheSwgDQogICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICApDQoNCmxhdGlub18yMDEzDQpgYGANCg0KIyMgTGF0aW5vIDIwMTUNCg0KYGBge3J9DQpsb2FkKGxhdGlubzIwMTVfdXJsKQ0KDQpsYXRpbm9fMjAxNSA8LSBsYXRpbm8yMDE1ICU+JQ0KICBtdXRhdGUoc2V4ID0gUzEyIC0gMSkgJT4lICMgc2V4IHZhcmlhYmxlIGVyc3RlbGxlbg0KICByZW5hbWUoDQogICAgZWR1YyA9IFJFRURVQ18xLA0KICAgIGluY29tZSA9IFM0LA0KICAgIGRlbXRvZGF5ID0gUDE3U1RHQlMsDQogICAgYWdlID0gUzEzDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICB0cnVzdF9nb3YgPSA1IC0gUDE2U1QuRywNCiAgICB0cnVzdF9wYXJsaWFtZW50ID0gNSAtIFAxNlNULkYsDQogICAgdHJ1c3RfcG9saWNlID0gNSAtIFAxNlRHQi5CLA0KICAgIHRydXN0X2NvdXJ0cyA9IDUgLSBQMTZTVC5ILA0KICAgIHdvcmsgPSBSZWNvZGUoDQogICAgICBTMjEuQSwNCiAgICAgICIyID0gMTsNCiAgICAgICAzID0gMTsNCiAgICAgICA0ID0gMDsNCiAgICAgICA1ID0gMDsNCiAgICAgICA2ID0gMDsNCiAgICAgICA3ID0gMCINCiAgICApLA0KICAgIGNudHJ5ID0gdG9fbGFiZWwoSURFTlBBKSwNCiAgICBpbmNvbWUgPSA1IC0gaW5jb21lLA0KICAgIHllYXIgPSAyMDE1DQogICkgJT4lDQogIHNlbGVjdCgNCiAgICBjbnRyeSwgeWVhciwgYWdlLCBzZXgsIGluY29tZSwgZWR1Yywgd29yaywgZGVtdG9kYXksIA0KICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgKQ0KDQpsYXRpbm9fMjAxNQ0KYGBgDQoNCiMjIE1lcmdpbmcgdGhlIERhdGENCg0KYGBge3J9DQpsYXRpbm9fcmVhbCA8LSBsYXRpbm9fMjAxMyAlPiUgDQogIG11dGF0ZV9hdCgNCiAgICB2YXJzKA0KICAgICAgaW5jb21lLCBkZW10b2RheSwgZWR1YywNCiAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICAgKSwNCiAgICByYW5nZTAxDQogICkNCg0KbGF0aW5vX3JlYWwyIDwtIGxhdGlub18yMDE1ICU+JSANCiAgbXV0YXRlX2F0KA0KICAgIHZhcnMoDQogICAgICBpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLA0KICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICApLA0KICAgIHJhbmdlMDENCiAgKQ0KDQpsYXRpbm8gPC0gcmJpbmQobGF0aW5vX3JlYWwsIGxhdGlub19yZWFsMikgJT4lIGFzLnRibCgpDQoNCmxhdGlubw0KDQpgYGANCg0KDQoNCiMgV29ybGQgVmFsdWUgU3VydmV5DQoNCmBgYHtyfQ0KbG9hZCh3dnNfcmF3X3VybCkNCg0Kd3ZzIDwtIHd2c19yYXcgJT4lDQogIHJlbmFtZSgNCiAgICBlZHVjID0gVjI0OCwNCiAgICBpbmNvbWUgPSBWMjM5LA0KICAgIGRlbXRvZGF5ID0gVjE0MSwNCiAgICBhZ2UgPSBWMjQyLA0KICAgIHllYXIgPSBWMjYyDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBzZXggPSBWMjQwIC0gMSwgIyBzZXggdmFyaWFibGUgZXJzdGVsbGVuDQogICAgdHJ1c3RfZ292ID0gNSAtIFYxMTUsDQogICAgdHJ1c3RfcGFybGlhbWVudCA9IDUgLSBWMTE3LA0KICAgIHRydXN0X3BvbGljZSA9IDUgLSBWMTEzLA0KICAgIHRydXN0X2NvdXJ0cyA9IDUgLSBWMTE0LA0KICAgIHdvcmsgPSBSZWNvZGUoDQogICAgICBWMjI5LA0KICAgICAgIjIgPSAxOw0KICAgICAgIDMgPSAxOw0KICAgICAgIDQgPSAwOw0KICAgICAgIDUgPSAwOw0KICAgICAgIDYgPSAwOw0KICAgICAgIDcgPSAwOw0KICAgICAgIDggPSAwIg0KICAgICksDQogICAgY250cnkgPSB0b19sYWJlbChWMikNCiAgKSAlPiUNCiAgc2VsZWN0KA0KICAgIGNudHJ5LCB5ZWFyLCBhZ2UsIHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCBkZW10b2RheSwNCiAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgKQ0KDQoNCg0Kd3ZzDQpgYGANCg0KIyBBbWVyaWNhcyBCYXJvbWV0ZXINCg0KIyMgQW1lcmljYXMgTWFpbg0KDQpgYGB7cn0NCmxvYWQoYW1lcmljYXNfdXJsKQ0KDQphbWVyaWNhc18gPC0gYW1lcmljYXMgJT4lDQogIG11dGF0ZShjbnRyeSA9IHRvX2xhYmVsKHBhaXMpKSAlPiUNCiAgc2VsZWN0KA0KICAgIGNudHJ5LCBvY3VwNGEsIGVkLCBxMTBuZXcsIHExLCBxMiwNCiAgICBiMTBhLCBiMTMsIGIxOCwgYjIxYSwgbjMsIHllYXINCiAgKSAlPiUNCiAgcmVuYW1lKA0KICAgIHdvcmsgPSBvY3VwNGEsDQogICAgZWR1YyA9IGVkLA0KICAgIGluY29tZSA9IHExMG5ldywNCiAgICBzZXggPSBxMSwNCiAgICBhZ2UgPSBxMiwNCiAgICB0cnVzdF9jb3VydHMgPSBiMTBhLA0KICAgIHRydXN0X3BhcmxpYW1lbnQgPSBiMTMsDQogICAgdHJ1c3RfcG9saWNlID0gYjE4LA0KICAgIHRydXN0X2dvdiA9IGIyMWEsDQogICAgZGVtdG9kYXkgPSBuMw0KICApICU+JQ0KICBtdXRhdGUoDQogICAgc2V4ID0gc2V4IC0gMSwgIyBzZXggdmFyaWFibGUgZXJzdGVsbGVuDQogICAgd29yayA9IFJlY29kZSgNCiAgICAgIHdvcmssDQogICAgICAiMiA9IDE7DQogICAgICAgMyA9IDE7DQogICAgICAgNCA9IDA7DQogICAgICAgNSA9IDA7DQogICAgICAgNiA9IDA7DQogICAgICAgNyA9IDAiDQogICAgKQ0KICApICU+JQ0KICBzZWxlY3QoDQogICAgY250cnksIHllYXIsIGFnZSwgc2V4LCBpbmNvbWUsIGVkdWMsIHdvcmssIGRlbXRvZGF5LCANCiAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICkNCg0KYW1lcmljYXNfDQpgYGANCg0KDQojIyBCb2xpdmlhDQoNCmBgYHtyfQ0KbG9hZChib2xpdmlhX3VybCkNCg0KYm9saXZpYV8gPC0gYm9saXZpYSAlPiUNCiAgbXV0YXRlKGNudHJ5ID0gdG9fbGFiZWwocGFpcykpICU+JQ0KICBzZWxlY3QoDQogICAgY250cnksIG9jdXA0YSwgZWQsIHExMG5ldywgcTEsIHEyLA0KICAgIGIxMGEsIGIxMywgYjE4LCBiMjFhLCBuMywgeWVhcg0KICApICU+JQ0KICByZW5hbWUoDQogICAgd29yayA9IG9jdXA0YSwNCiAgICBlZHVjID0gZWQsDQogICAgaW5jb21lID0gcTEwbmV3LA0KICAgIHNleCA9IHExLA0KICAgIGFnZSA9IHEyLA0KICAgIHRydXN0X2NvdXJ0cyA9IGIxMGEsDQogICAgdHJ1c3RfcGFybGlhbWVudCA9IGIxMywNCiAgICB0cnVzdF9wb2xpY2UgPSBiMTgsDQogICAgdHJ1c3RfZ292ID0gYjIxYSwgIyB2aWVsZSBtaXNzaW5nIHZhbHVlcw0KICAgIGRlbXRvZGF5ID0gbjMNCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIHNleCA9IHNleCAtIDEsICMgc2V4IHZhcmlhYmxlIGVyc3RlbGxlbg0KICAgIHdvcmsgPSBSZWNvZGUoDQogICAgICB3b3JrLA0KICAgICAgIjIgPSAxOw0KICAgICAgIDMgPSAxOw0KICAgICAgIDQgPSAwOw0KICAgICAgIDUgPSAwOw0KICAgICAgIDYgPSAwOw0KICAgICAgIDcgPSAwIg0KICAgICkNCiAgKSAlPiUNCiAgc2VsZWN0KA0KICAgIGNudHJ5LCB5ZWFyLCBhZ2UsIHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCBkZW10b2RheSwgDQogICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICApDQoNCmJvbGl2aWFfDQpgYGANCg0KIyMgQ2FuYWRhDQoNCmBgYHtyfQ0KbG9hZChjYW5hZGFfdXJsKQ0KDQpjYW5hZGFfIDwtIGNhbmFkYSAlPiUNCiAgbXV0YXRlKGNudHJ5ID0gdG9fbGFiZWwocGFpcykpICU+JQ0KICBzZWxlY3QoDQogICAgY250cnksIGV4YzEzLCBlZHVjYXRpb24sIHExMCwgcTEsIHEyLA0KICAgIGIxMGEsIGIxMywgYjE4LCBiMjFhLCBuMywgeWVhcg0KICApICU+JQ0KICByZW5hbWUoDQogICAgd29yayA9IGV4YzEzLA0KICAgIGVkdWMgPSBlZHVjYXRpb24sDQogICAgaW5jb21lID0gcTEwLA0KICAgIHNleCA9IHExLA0KICAgIGFnZSA9IHEyLA0KICAgIHRydXN0X2NvdXJ0cyA9IGIxMGEsDQogICAgdHJ1c3RfcGFybGlhbWVudCA9IGIxMywNCiAgICB0cnVzdF9wb2xpY2UgPSBiMTgsDQogICAgdHJ1c3RfZ292ID0gYjIxYSwNCiAgICBkZW10b2RheSA9IG4zDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBzZXggPSBzZXggLSAxLCAjIHNleCB2YXJpYWJsZSBlcnN0ZWxsZW4NCiAgICB3b3JrID0gd29yayAtIDEsDQogICAgaW5jb21lID0gaWZlbHNlKGluY29tZSA9PSA4OCwgTkEsIGluY29tZSkNCiAgKSAlPiUNCiAgc2VsZWN0KA0KICAgIGNudHJ5LCB5ZWFyLCBhZ2UsIHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCBkZW10b2RheSwgDQogICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICApDQoNCmNhbmFkYV8NCmBgYA0KDQojIyBNZXJnaW5nIHRoZSBEYXRhDQoNCmBgYHtyfQ0KYW1lcmljYXMgPC0gYW1lcmljYXNfICU+JSANCiAgbXV0YXRlX2F0KA0KICAgIHZhcnMoDQogICAgICBpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLA0KICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICApLA0KICAgIHJhbmdlMDENCiAgKQ0KDQpib2xpdmlhIDwtIGJvbGl2aWFfICU+JSANCiAgbXV0YXRlX2F0KA0KICAgIHZhcnMoDQogICAgICBpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLA0KICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICApLA0KICAgIHJhbmdlMDENCiAgKQ0KDQpjYW5hZGEgPC0gY2FuYWRhXyAlPiUgDQogIG11dGF0ZV9hdCgNCiAgICB2YXJzKA0KICAgICAgaW5jb21lLCBkZW10b2RheSwgZWR1YywNCiAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICAgKSwNCiAgICByYW5nZTAxDQogICkNCg0KDQphbWVyaWNhcyA8LSByYmluZChhbWVyaWNhcywgYm9saXZpYSwgY2FuYWRhKQ0KDQphbWVyaWNhcw0KYGBgDQoNCiMgQXNpYW4gQmFyb21ldGVyDQoNCmBgYHtyfQ0KbG9hZChhc2lhbl9yYXdfdXJsKQ0KDQpkZWxldGVfbmFfYXNpYW4gPC0gZnVuY3Rpb24oeCkgew0KICB4IDwtIFJlY29kZSgNCiAgICB4LA0KICAgICItMiA9IE5BOw0KICAgICAgNyA9IE5BOw0KICAgICAgOCA9IE5BOw0KICAgICAgOSA9IE5BOw0KICAgICA5NyA9IE5BOw0KICAgICA5OCA9IE5BOw0KICAgICA5OSA9IE5BOw0KICAgICAtMSA9IE5BIg0KICApDQoNCiAgcmV0dXJuKHgpDQp9ICMgRnVua3Rpb24gdW0gZGllIE5BcyBpbSBhc2lhbiBEYXRlbnNhdHogenUgYmVzdGltbWVuDQoNCmFzaWFuXzMgPC0gYXNpYW5fcmF3ICU+JQ0KICByZW5hbWUoDQogICAgZWR1YyA9IHNlNSwNCiAgICB0cnVzdF9nb3YgPSBxOSwNCiAgICB0cnVzdF9wYXJsaWFtZW50ID0gcTExLA0KICAgIHRydXN0X3BvbGljZSA9IHExNCwNCiAgICB0cnVzdF9jb3VydHMgPSBxOCwNCiAgICBzZXggPSBzZTIsDQogICAgaW5jb21lID0gc2UxM2EsDQogICAgd29yayA9IHNlOQ0KICApICU+JQ0KICBtdXRhdGVfYXQoDQogICAgdmFycygNCiAgICAgIGluY29tZSwgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMsIHdvcmssIHNleA0KICAgICksDQogICAgZGVsZXRlX25hX2FzaWFuDQogICkgJT4lICMgTkFzIGRlbGV0ZW4NCiAgbXV0YXRlKA0KICAgIHRydXN0X2dvdiA9IDUgLSB0cnVzdF9nb3YsDQogICAgdHJ1c3RfcGFybGlhbWVudCA9IDUgLSB0cnVzdF9wYXJsaWFtZW50LA0KICAgIHRydXN0X3BvbGljZSA9IDUgLSB0cnVzdF9wb2xpY2UsDQogICAgdHJ1c3RfY291cnRzID0gNSAtIHRydXN0X2NvdXJ0cywNCiAgICBzZXggPSBzZXggLSAxLCAjIHNleCAoMC8xKSBjb2RpZXJlbg0KICAgIGluY29tZSA9IFJlY29kZSgNCiAgICAgIGluY29tZSwNCiAgICAgICIwID0gTkEiDQogICAgKSwNCiAgICBpbmNvbWUgPSA1IC0gaW5jb21lLA0KICAgIHdvcmsgPSBSZWNvZGUoDQogICAgICB3b3JrLCAjIHdvcmsgKDAvMSkgY29kaWVyZW4NCiAgICAgICIyID0gMCINCiAgICApLA0KICAgIGFnZSA9IFJlY29kZSgNCiAgICAgIHNlM2EsICMgbWlzc2luZyB2YWx1ZXMgbD9zY2hlbg0KICAgICAgIi0xID0gTkEiDQogICAgKSwNCiAgICBkZW10b2RheSA9IFJlY29kZSgNCiAgICAgIHE5MSwNCiAgICAgICItMSA9IE5BOw0KICAgICAgIDk3ID0gTkE7DQogICAgICAgOTggPSBOQTsNCiAgICAgICA5OSA9IE5BIg0KICAgICksDQogICAgZWR1YyA9IFJlY29kZSgNCiAgICAgIGVkdWMsDQogICAgICAiLTEgPSBOQTsNCiAgICAgICA5OCA9IE5BOw0KICAgICAgIDk5ID0gTkEiDQogICAgKSwNCiAgICBjbnRyeSA9IHRvX2xhYmVsKGNvdW50cnkpLA0KICAgIHllYXIgPSBhcy5udW1lcmljKGZvcm1hdChpcjksICIlWSIpKQ0KICApICU+JQ0KICBzZWxlY3QoDQogICAgY250cnksIHllYXIsIGFnZSwgc2V4LCBpbmNvbWUsIGVkdWMsIHdvcmssIGRlbXRvZGF5LCANCiAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICkgDQoNCmFzaWFuXzMNCg0KYGBgDQoNCiMjIFdhdmUgNA0KDQpgYGB7cn0NCmxvYWQobXlhbm1hcl9yYXdfdXJsKQ0KDQpuZWVkZWQgPC0gZnVuY3Rpb24oZGF0YSkgew0KICBzcyA8LSBkYXRhICU+JQ0KICAgIHJlbmFtZSgNCiAgICAgIGVkdWMgPSBzZTUsDQogICAgICB0cnVzdF9nb3YgPSBxOSwNCiAgICAgIHRydXN0X3BhcmxpYW1lbnQgPSBxMTEsDQogICAgICB0cnVzdF9wb2xpY2UgPSBxMTQsDQogICAgICB0cnVzdF9jb3VydHMgPSBxOCwNCiAgICAgIHNleCA9IHNlMiwNCiAgICAgIGluY29tZSA9IHNlMTNhLA0KICAgICAgd29yayA9IHNlOQ0KICAgICkgJT4lDQogICAgbXV0YXRlX2F0KA0KICAgICAgdmFycygNCiAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cywgd29yaywgc2V4DQogICAgICApLA0KICAgICAgZGVsZXRlX25hX2FzaWFuDQogICAgKSAlPiUgIyBOQXMgZGVsZXRlbg0KICAgIG11dGF0ZSgNCiAgICAgIHRydXN0X2dvdiA9IDUgLSB0cnVzdF9nb3YsDQogICAgICB0cnVzdF9wYXJsaWFtZW50ID0gNSAtIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICB0cnVzdF9wb2xpY2UgPSA1IC0gdHJ1c3RfcG9saWNlLA0KICAgICAgdHJ1c3RfY291cnRzID0gNSAtIHRydXN0X2NvdXJ0cywNCiAgICAgIHNleCA9IHNleCAtIDEsICMgc2V4ICgwLzEpIGNvZGllcmVuDQogICAgICBpbmNvbWUgPSBSZWNvZGUoDQogICAgICAgIGluY29tZSwNCiAgICAgICAgIjAgPSBOQTsNCiAgICAgICAgOTcgPSBOQTsNCiAgICAgICAgOTggPSBOQTsNCiAgICAgICAgOTkgPSBOQTsNCiAgICAgICAgLTEgPSBOQSINCiAgICAgICksDQogICAgICB3b3JrID0gUmVjb2RlKA0KICAgICAgICB3b3JrLCAjIHdvcmsgKDAvMSkgY29kaWVyZW4NCiAgICAgICAgIjIgPSAwIg0KICAgICAgKSwNCiAgICAgIGFnZSA9IFJlY29kZSgNCiAgICAgICAgc2UzXzIsICMgbWlzc2luZyB2YWx1ZXMgbD9zY2hlbg0KICAgICAgICAiLTEgPSBOQSINCiAgICAgICksDQogICAgICBkZW10b2RheSA9IFJlY29kZSgNCiAgICAgICAgcTk0LA0KICAgICAgICAiLTEgPSBOQTsNCiAgICAgICAgIDk3ID0gTkE7DQogICAgICAgICA5OCA9IE5BOw0KICAgICAgICAgOTkgPSBOQSINCiAgICAgICksDQogICAgICBlZHVjID0gUmVjb2RlKA0KICAgICAgICBlZHVjLA0KICAgICAgICAiLTEgPSBOQTsNCiAgICAgICAgIDk4ID0gTkE7DQogICAgICAgICA5OSA9IE5BIg0KICAgICAgKSwNCiAgICAgIGNudHJ5ID0gdG9fbGFiZWwoY291bnRyeSksDQogICAgICB5ZWFyID0geWVhcg0KICAgICkgJT4lDQogICAgc2VsZWN0KA0KICAgICAgY250cnksIHllYXIsIGFnZSwgc2V4LCBpbmNvbWUsIGVkdWMsIHdvcmssIGRlbXRvZGF5LCANCiAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICApDQogIA0KICByZXR1cm4oc3MpDQp9DQpteWFubWFyIDwtIG5lZWRlZChteWFubWFyX3JhdykNCg0KbG9hZChtb25nb2xpYV9yYXdfdXJsKQ0KbG9hZChwaGlsaXBfcmF3X3VybCkNCmxvYWQodGFpd2FuX3Jhd191cmwpDQpsb2FkKHRoYWlfcmF3X3VybCkNCmxvYWQobWFsYXlfcmF3X3VybCkNCmxvYWQoc2luZ2Fwb3JlX3Jhd191cmwpDQpsb2FkKHNrX3Jhd191cmwpDQpsb2FkKGNhbWJvZGlhX3Jhd191cmwpDQoNCm1vbmdvbGlhICA8LSBuZWVkZWQobW9uZ29saWFfcmF3KQ0KcGhpbGlwICAgIDwtIG5lZWRlZChwaGlsaXBfcmF3KQ0KDQp0aGFpICAgICAgPC0gbmVlZGVkKHRoYWlfcmF3KQ0KbWFsYXkgICAgIDwtIG5lZWRlZChtYWxheV9yYXcpDQpzaW5nYXBvcmUgPC0gbmVlZGVkKHNpbmdhcG9yZV9yYXcpICMgU2luZ2Fwb3JlIGhhdCBleHRyZW0gdmllbGUgTWlzc2luZyB2YWx1ZXMNCnNrICAgICAgICA8LSBuZWVkZWQoc2tfcmF3KQ0KY2FtYm9kaWEgIDwtIG5lZWRlZChjYW1ib2RpYV9yYXcpDQoNCg0KYGBgDQojIyBTb25kZXJmYWxsIFRhaXdhbg0KDQpgYGB7cn0NCg0KIyBUYWl3YW4gUHJvYmxlbTogSW5jb21lIG9ubHkgaGFzIDMgY2F0ZWdvcmllcw0KDQp0YWl3YW4gPC0gdGFpd2FuX3JhdyAlPiUNCiAgICByZW5hbWUoDQogICAgICBlZHVjID0gc2U1LA0KICAgICAgdHJ1c3RfZ292ID0gcTksDQogICAgICB0cnVzdF9wYXJsaWFtZW50ID0gcTExLA0KICAgICAgdHJ1c3RfcG9saWNlID0gcTE0LA0KICAgICAgdHJ1c3RfY291cnRzID0gcTgsDQogICAgICBzZXggPSBzZTIsDQogICAgICBpbmNvbWUgPSBzZTE0YSwNCiAgICAgIHdvcmsgPSBzZTkNCiAgICApICU+JQ0KICAgIG11dGF0ZV9hdCgNCiAgICAgIHZhcnMoDQogICAgICAgIGluY29tZSwgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cywgd29yaywgc2V4DQogICAgICApLA0KICAgICAgZGVsZXRlX25hX2FzaWFuDQogICAgKSAlPiUgIyBOQXMgZGVsZXRlbg0KICAgIG11dGF0ZSgNCiAgICAgIHRydXN0X2dvdiA9IDUgLSB0cnVzdF9nb3YsDQogICAgICB0cnVzdF9wYXJsaWFtZW50ID0gNSAtIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICB0cnVzdF9wb2xpY2UgPSA1IC0gdHJ1c3RfcG9saWNlLA0KICAgICAgdHJ1c3RfY291cnRzID0gNSAtIHRydXN0X2NvdXJ0cywNCiAgICAgIHNleCA9IHNleCAtIDEsICMgc2V4ICgwLzEpIGNvZGllcmVuDQogICAgICBpbmNvbWUgPSBSZWNvZGUoDQogICAgICAgIDQgLSBpbmNvbWUsDQogICAgICAgICI4ID0gTkE7DQogICAgICAgICA5ID0gTkEiDQogICAgICApLA0KICAgICAgd29yayA9IFJlY29kZSgNCiAgICAgICAgd29yaywgIyB3b3JrICgwLzEpIGNvZGllcmVuDQogICAgICAgICIyID0gMCINCiAgICAgICksDQogICAgICBhZ2UgPSBSZWNvZGUoDQogICAgICAgIHNlM18yLCAjIG1pc3NpbmcgdmFsdWVzIGw/c2NoZW4NCiAgICAgICAgIi0xID0gTkEiDQogICAgICApLA0KICAgICAgZGVtdG9kYXkgPSBSZWNvZGUoDQogICAgICAgIHE5NCwNCiAgICAgICAgIi0xID0gTkE7DQogICAgICAgICA5NyA9IE5BOw0KICAgICAgICAgOTggPSBOQTsNCiAgICAgICAgIDk5ID0gTkEiDQogICAgICApLA0KICAgICAgZWR1YyA9IFJlY29kZSgNCiAgICAgICAgZWR1YywNCiAgICAgICAgIi0xID0gTkE7DQogICAgICAgICA5OCA9IE5BOw0KICAgICAgICAgOTkgPSBOQSINCiAgICAgICksDQogICAgICBjbnRyeSA9IHRvX2xhYmVsKGNvdW50cnkpLA0KICAgICAgeWVhciA9IHllYXINCiAgICApICU+JQ0KICAgIHNlbGVjdCgNCiAgICAgIGNudHJ5LCB5ZWFyLCBhZ2UsIHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCBkZW10b2RheSwgDQogICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICAgKQ0KDQpgYGANCg0KDQojIyBNZXJnaW5nIERhdGENCg0KYGBge3J9DQoNCmFzaWFuXzMgJTw+JQ0KICAgIG11dGF0ZV9hdCgNCiAgICAgIHZhcnMoDQogICAgICAgIGluY29tZSwgZGVtdG9kYXksIGVkdWMsDQogICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICAgICksDQogICAgICByYW5nZTAxDQogICAgKQ0KDQpteWFubWFyICU8PiUNCiAgICBtdXRhdGVfYXQoDQogICAgICB2YXJzKA0KICAgICAgICBpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLA0KICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICAgICApLA0KICAgICAgcmFuZ2UwMQ0KICAgICkNCg0KbW9uZ29saWEgJTw+JQ0KICAgIG11dGF0ZV9hdCgNCiAgICAgIHZhcnMoDQogICAgICAgIGluY29tZSwgZGVtdG9kYXksIGVkdWMsDQogICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICAgICksDQogICAgICByYW5nZTAxDQogICAgKQ0KDQpwaGlsaXAgJTw+JQ0KICAgIG11dGF0ZV9hdCgNCiAgICAgIHZhcnMoDQogICAgICAgIGluY29tZSwgZGVtdG9kYXksIGVkdWMsDQogICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICAgICksDQogICAgICByYW5nZTAxDQogICAgKSAgDQoNCnRhaXdhbiAlPD4lDQogICAgbXV0YXRlX2F0KA0KICAgICAgdmFycygNCiAgICAgICAgaW5jb21lLCBkZW10b2RheSwgZWR1YywNCiAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICAgICAgKSwNCiAgICAgIHJhbmdlMDENCiAgICApICANCg0KdGhhaSAlPD4lDQogICAgbXV0YXRlX2F0KA0KICAgICAgdmFycygNCiAgICAgICAgaW5jb21lLCBkZW10b2RheSwgZWR1YywNCiAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICAgICAgKSwNCiAgICAgIHJhbmdlMDENCiAgICApDQoNCm1hbGF5ICU8PiUNCiAgICBtdXRhdGVfYXQoDQogICAgICB2YXJzKA0KICAgICAgICBpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLA0KICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICAgICApLA0KICAgICAgcmFuZ2UwMQ0KICAgICkNCg0Kc2luZ2Fwb3JlICU8PiUNCiAgICBtdXRhdGVfYXQoDQogICAgICB2YXJzKA0KICAgICAgICBpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLA0KICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICAgICApLA0KICAgICAgcmFuZ2UwMQ0KICAgICkNCg0Kc2sgJTw+JQ0KICAgIG11dGF0ZV9hdCgNCiAgICAgIHZhcnMoDQogICAgICAgIGluY29tZSwgZGVtdG9kYXksIGVkdWMsDQogICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICAgICksDQogICAgICByYW5nZTAxDQogICAgKQ0KDQpjYW1ib2RpYSAlPD4lDQogICAgbXV0YXRlX2F0KA0KICAgICAgdmFycygNCiAgICAgICAgaW5jb21lLCBkZW10b2RheSwgZWR1YywNCiAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICAgICAgKSwNCiAgICAgIHJhbmdlMDENCiAgICApDQoNCmFzaWFuIDwtIHJiaW5kKA0KICBhc2lhbl8zLCBteWFubWFyLCBjYW1ib2RpYSwgc2ssIHNpbmdhcG9yZSwgbWFsYXksIHRoYWksIHRhaXdhbiwgcGhpbGlwLA0KICBjYW1ib2RpYSwgbW9uZ29saWENCikgJT4lIGFzLnRibCgpDQoNCmFzaWFuDQpgYGANCg0KDQojIEV1cm9wZWFuIFNvY2lhbCBTdXJ2ZXkNCg0KYGBge3J9DQpsb2FkKEVTU19yYXdfdXJsKQ0KDQpFU1MgPC0gRVNTX3JhdyAlPiUNCiAgcmVuYW1lKA0KICAgIGRlbXRvZGF5ID0gZG1jbnRvdiwNCiAgICBhZ2UgPSBhZ2VhLA0KICAgIHllYXIgPSBpbnd5eXMsDQogICAgdHJ1c3RfZ292ID0gdHJzdHBsdCwNCiAgICB0cnVzdF9wYXJsaWFtZW50ID0gdHJzdHBybCwNCiAgICB0cnVzdF9wb2xpY2UgPSB0cnN0cGxjLA0KICAgIHRydXN0X2NvdXJ0cyA9IHRyc3RsZ2wNCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIGluY29tZSA9IDUgLSBoaW5jZmVsLA0KICAgIGVkdWMgPSBSZWNvZGUoDQogICAgICBlaXNjZWQsDQogICAgICAiNTUgPSBOQSINCiAgICApLA0KICAgIHdvcmsgPSBpZmVsc2UobW5hY3RpYyA9PSAxLCAxLCAwKSwNCiAgICBzZXggPSBnbmRyIC0gMSwgIyBzZXggdmFyaWFibGUgZXJzdGVsbGVuDQogICAgY250cnkgPSB0b19sYWJlbChjbnRyeSkNCiAgKSAlPiUgIA0KICBtdXRhdGVfYXQoDQogICAgdmFycygNCiAgICAgIGluY29tZSwgZGVtdG9kYXksIGVkdWMsDQogICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICAgICksDQogICAgc3Rkeg0KICApICU+JQ0KICBzZWxlY3QoDQogICAgY250cnksIHllYXIsIGFnZSwgc2V4LCBpbmNvbWUsIGVkdWMsIHdvcmssIGRlbXRvZGF5LCB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgKQ0KDQoNCkVTUw0KYGBgDQoNCg0KIyBNZXJnaW5nIEV2ZXJ5dGhpbmcNCg0KYGBge3J9DQoNCmFmcm8gJTw+JSANCiAgbXV0YXRlKHN1cnZleSA9IHJlcCgiYWZybyIsIG5yb3coYWZybykpKSAlPiUgDQogIG11dGF0ZShjbnRyeSA9IGNvdW50cnljb2RlKGNudHJ5LCAiY291bnRyeS5uYW1lLmVuIiwgImNvdW50cnkubmFtZS5lbiIpKSANCg0KbGF0aW5vICU8PiUgIA0KICBtdXRhdGUoc3VydmV5ID0gcmVwKCJsYXRpbm8iLCBucm93KGxhdGlubykpKSAlPiUgDQogIG11dGF0ZShjbnRyeSA9IGNvdW50cnljb2RlKGNudHJ5LCAiY291bnRyeS5uYW1lLmVuIiwgImNvdW50cnkubmFtZS5lbiIpKQ0KDQphbWVyaWNhcyAlPD4lICANCiAgbXV0YXRlKHN1cnZleSA9IHJlcCgiYW1lcmljYXMiLCBucm93KGFtZXJpY2FzKSkpICU+JSANCiAgbXV0YXRlKGNudHJ5ID0gY291bnRyeWNvZGUoY250cnksICJjb3VudHJ5Lm5hbWUuZW4iLCAiY291bnRyeS5uYW1lLmVuIikpDQoNCmFzaWFuICU8PiUgIA0KICBtdXRhdGUoc3VydmV5ID0gcmVwKCJhc2lhbiIsIG5yb3coYXNpYW4pKSkgJT4lIA0KICBtdXRhdGUoY250cnkgPSBjb3VudHJ5Y29kZShjbnRyeSwgImNvdW50cnkubmFtZS5lbiIsICJjb3VudHJ5Lm5hbWUuZW4iKSkNCg0Kd3ZzICU8PiUgIA0KICBtdXRhdGUoc3VydmV5ID0gcmVwKCJ3dnMiLCBucm93KHd2cykpKSAlPiUgDQogIG11dGF0ZShjbnRyeSA9IGNvdW50cnljb2RlKGNudHJ5LCAiY291bnRyeS5uYW1lLmVuIiwgImNvdW50cnkubmFtZS5lbiIpKSAlPD4lDQogICAgbXV0YXRlX2F0KA0KICAgICAgdmFycygNCiAgICAgICAgaW5jb21lLCBkZW10b2RheSwgZWR1YywNCiAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICAgICAgKSwNCiAgICAgIHJhbmdlMDENCiAgICApDQoNCkVTUyAlPD4lICANCiAgbXV0YXRlKHN1cnZleSA9IHJlcCgiRVNTIiwgbnJvdyhFU1MpKSkgJT4lIA0KICBtdXRhdGUoY250cnkgPSBjb3VudHJ5Y29kZShjbnRyeSwgImNvdW50cnkubmFtZS5lbiIsICJjb3VudHJ5Lm5hbWUuZW4iKSkgJTw+JQ0KICAgIG11dGF0ZV9hdCgNCiAgICAgIHZhcnMoDQogICAgICAgIGluY29tZSwgZGVtdG9kYXksIGVkdWMsDQogICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICAgICksDQogICAgICByYW5nZTAxDQogICAgKQ0KDQp1bmlxdWUoRVNTJGNudHJ5KQ0KdW5pcXVlKGFzaWFuJGNudHJ5KQ0KdW5pcXVlKHd2cyRjbnRyeSkNCnVuaXF1ZShsYXRpbm8kY250cnkpDQp1bmlxdWUoYW1lcmljYXMkY250cnkpDQp1bmlxdWUoYWZybyRjbnRyeSkNCg0KbWVyZ2VkIDwtIHJiaW5kKHd2cywgbGF0aW5vLCBhZnJvLCBhbWVyaWNhcywgYXNpYW4sIEVTUykNCg0KbWVyZ2VkICU8PiUNCiAgIyBjcmVhdGUgZHVtbWllcw0KICBtdXRhdGUoDQogICAgd3ZzID0gaWZlbHNlKHN1cnZleSA9PSAid3ZzIiwgMSwgMCksDQogICAgYWZybyA9IGlmZWxzZShzdXJ2ZXkgPT0gImFmcm8iLCAxLCAwKSwNCiAgICBsYXRpbm8gPSBpZmVsc2Uoc3VydmV5ID09ICJsYXRpbm8iLCAxLCAwKSwNCiAgICBhbWVyaWNhcyA9IGlmZWxzZShzdXJ2ZXkgPT0gImFtZXJpY2FzIiwgMSwgMCksDQogICAgYXNpYW4gPSBpZmVsc2Uoc3VydmV5ID09ICJhc2lhbiIsIDEsIDApLA0KICAgIEVTUyA9IGlmZWxzZShzdXJ2ZXkgPT0gIkVTUyIsIDEsIDApDQogICkgJT4lDQogICMgZmlsdGVyIGJhZCBjb3VudHJpZXMNCiAgZmlsdGVyKGNudHJ5ICE9ICJFZ3lwdCIpICU+JSAjIGV4Y2x1ZGUgRWd5cHQgMjAxMw0KICBmaWx0ZXIoY250cnkgIT0gIkxpYnlhIikgJT4lICMgZXhjbHVkZSBMaWJ5YSAyMDE0DQogIGZpbHRlcihjbnRyeSAhPSAiTWFsaSIpICU+JSAjIGV4Y2x1ZGUgTWFsaSAyMDEyDQogIGZpbHRlcihjbnRyeSAhPSAiWWVtZW4iKSAlPiUgIyBleGNsdWRlIFllbWVuIDIwMTINCiAgZmlsdGVyKGNudHJ5ICE9ICJQYWxlc3RpbmUsIFN0YXRlIG9mIikgIyBleGNsdWRlIFBhbGVzdGluZSAyMDEzDQoNCiMgYWRkaW5nIHdlaWdodA0KbWVyZ2VkICU8PiUNCiAgZ3JvdXBfYnkoY250cnkpICU+JQ0KICB0YWxseSgpICU+JQ0KICBtdXRhdGUod2VpZ2h0ID0gMTAwMCAvIG4pICU+JQ0KICBzZWxlY3QoY250cnksIHdlaWdodCkgJT4lDQogIGxlZnRfam9pbihtZXJnZWQsICJjbnRyeSIpDQojIHNlbGVjdChjbnRyeSwgeWVhcikgJT4lDQojIHVuaXF1ZSAlPiUNCiMgVmlldw0KDQptZXJnZWQNCg0KdGFibGUobWVyZ2VkJHd2cykNCnRhYmxlKG1lcmdlZCRhZnJvKQ0KdGFibGUobWVyZ2VkJGxhdGlubykNCnRhYmxlKG1lcmdlZCRhbWVyaWNhcykNCnRhYmxlKG1lcmdlZCRhc2lhbikNCnRhYmxlKG1lcmdlZCRFU1MpDQpgYGANCg0KDQoNCiMjIFNFTSBJbmRleA0KDQpgYGB7cn0NCm1lcmdlZDIgPC0gbWVyZ2VkICU+JQ0KICBtdXRhdGUoZ292X3RydXN0ID0gdHJ1c3RfZ292ICsgdHJ1c3RfcGFybGlhbWVudCArIA0KICAgICAgICAgICB0cnVzdF9wb2xpY2UgKyB0cnVzdF9jb3VydHMpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGdvdl90cnVzdCkpDQoNCm1lcmdlZDMgPC0gbWVyZ2VkICU+JQ0KICBtdXRhdGUoZ292X3RydXN0ID0gdHJ1c3RfZ292ICsgdHJ1c3RfcGFybGlhbWVudCArIA0KICAgICAgICAgICB0cnVzdF9wb2xpY2UgKyB0cnVzdF9jb3VydHMpICU+JQ0KICBmaWx0ZXIoaXMubmEoZ292X3RydXN0KSkNCg0Kc3Z5LmRmIDwtIHN1cnZleTo6c3Z5ZGVzaWduKGlkPSB+MSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHM9IH53ZWlnaHQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPSBtZXJnZWQpIA0KDQptb2RlbCA8LSAnIyBtZWFzdXJlbWVudCBtb2RlbCAxDQpnb3ZfdHJ1c3QyID1+IDEqdHJ1c3RfZ292ICsgdHJ1c3RfcGFybGlhbWVudCArIA0KdHJ1c3RfcG9saWNlICsgdHJ1c3RfY291cnRzDQp0cnVzdF9nb3Ygfn4gdHJ1c3RfcGFybGlhbWVudA0KJw0KDQptZXJnZWQgPC0gbWVyZ2VkICU+JQ0KICBtdXRhdGVfYXQodmFycyh0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwgYXMubnVtZXJpYykNCg0KIyBjb3IobmEub21pdChkYXRhLmZyYW1lKG1lcmdlZCR0cnVzdF9nb3YsDQojICAgICAgICAgICAgICAgbWVyZ2VkJHRydXN0X3BvbGljZSwNCiMgICAgICAgICAgICAgICBtZXJnZWQkdHJ1c3RfY291cnRzLA0KIyAgICAgICAgICAgICAgIG1lcmdlZCR0cnVzdF9wYXJsaWFtZW50LA0KIyAgICAgICAgICAgICAgIG1lcmdlZCRkZW10b2RheSkpKQ0KDQpsYXZhYW5fbW9kZWwxPC1jZmEobW9kZWwsIG1lYW5zdHJ1Y3R1cmUgPSBULCANCiAgICAgICAgICAgICAgICAgICBkYXRhID0gYXMuZGF0YS5mcmFtZShtZXJnZWQpLA0KICAgICAgICAgICAgICAgICAgIGVzdGltYXRvcj0gIk1MTSIpDQoNCmZpdF9hMTwtbGF2YWFuLnN1cnZleShsYXZhYW5fbW9kZWwxLCANCiAgICAgICAgICAgIGVzdGltYXRvcj0gIk1MTSIsIHN1cnZleS5kZXNpZ249c3Z5LmRmKQ0Kc3VtbWFyeShmaXRfYTEsIHN0YW5kYXJkaXplZD1UUlVFLGZpdC5tZWFzdXJlcyA9IFRSVUUsIHJzcSA9IFQpDQoNCm1lcmdlZDQ8LWNiaW5kKG1lcmdlZDIsIHByZWRpY3QoZml0X2ExLCBuZXdkYXRhID0gbWVyZ2VkMikpDQptZXJnZWQ0JGdvdl90cnVzdDI8LXJhbmdlMDEobWVyZ2VkNCRnb3ZfdHJ1c3QyKQ0KDQojIGhlYWQobWVyZ2VkNCkNCg0KbWVyZ2VkPC1wbHlyOjpyYmluZC5maWxsKG1lcmdlZDMsbWVyZ2VkNCkNCm1lcmdlZCRnb3ZfdHJ1c3Q8LW1lcmdlZCRnb3ZfdHJ1c3QyDQpoZWFkKG1lcmdlZCkNCmBgYA0KDQoNCiMjIFNvbWUgUmVjb2RpbmcNCg0KYGBge3J9DQp0YWJsZShtZXJnZWQkY250cnksbWVyZ2VkJHllYXIpDQoNCnRhYmxlKHN1YnNldChtZXJnZWQsbWVyZ2VkJGNudHJ5PT0iQ2hpbmEiKSRzdXJ2ZXksDQogICAgICBzdWJzZXQobWVyZ2VkLG1lcmdlZCRjbnRyeT09IkNoaW5hIikkeWVhcikNCg0KbWVyZ2VkJHllYXJbbWVyZ2VkJGNudHJ5PT0iQ2hpbmEiICYgbWVyZ2VkJHllYXIgPT0gMTU4M10gPC0gMjAxMQ0KbWVyZ2VkJHllYXJbbWVyZ2VkJGNudHJ5PT0iQ2hpbmEiICYgbWVyZ2VkJHllYXIgPT0gMjAwMF0gPC0gMjAxMQ0KbWVyZ2VkJHllYXJbbWVyZ2VkJGNudHJ5PT0iQ2hpbmEiICYgbWVyZ2VkJHllYXIgPT0gMjA3N10gPC0gMjAxMQ0KbWVyZ2VkJHllYXJbbWVyZ2VkJGNudHJ5PT0iQ2hpbmEiICYgbWVyZ2VkJHllYXIgPT0gMjAxMl0gPC0gMjAxMQ0KDQp0YWJsZShzdWJzZXQobWVyZ2VkLG1lcmdlZCRjbnRyeT09IlNpbmdhcG9yZSIpJHN1cnZleSwNCiAgICAgIHN1YnNldChtZXJnZWQsbWVyZ2VkJGNudHJ5PT0iU2luZ2Fwb3JlIikkeWVhcikNCg0KbWVyZ2VkJHllYXJbbWVyZ2VkJGNudHJ5PT0iU2luZ2Fwb3JlIiAmIG1lcmdlZCR5ZWFyID09IDE1ODJdIDwtIDIwMTENCg0KaGlzdChtZXJnZWQkZ292X3RydXN0KQ0KYGBgDQoNCg0KDQoNCiMgTGV2ZWwgMiBEYXRhDQoNCiMjIFYtRGVtDQoNCmBgYHtyfQ0KbG9hZCh2ZGVtc19zdGFydF91cmwpDQoNCnZkZW1zX3N1YiA8LSB2ZGVtc19zdGFydCAlPiUgZmlsdGVyKHllYXIgJWluJSAyMDAwOjIwMTApDQoNCiN0aWJibGUoaWQgPSAxOjE4OTYpDQojdGFibGUodmRlbXNfc3ViJGNvdW50cnlfbmFtZSkNCg0KdmRlbSA8LSB2ZGVtc19zdGFydCAlPiUNCiAgZmlsdGVyKHllYXIgJWluJSAyMDAwOjIwMTApICU+JSANCiAgZ3JvdXBfYnkoY291bnRyeV9uYW1lKSAlPiUNCiAgdGFsbHkgJT4lDQogIG11dGF0ZShjbnRyeSA9IHVuaXF1ZShjb3VudHJ5X25hbWUpKSAlPiUNCiAgI0RDSSBWYXJpYWJsZXMNCiAgbXV0YXRlKGRlbGliMTAgPSB2ZGVtc19zdWIgJT4lDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygidjJ4ZGxfZGVsaWIiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUoY29uc3VsdDEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2MmRsY29uc2x0IikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKHJlYXNvbjEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2MmRscmVhc29uIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKGNvbW1vbjEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2MmRsY29tbW9uIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKGNvdW50cjEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2MmRsY291bnRyIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKGVuZ2FnZTEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2MmRsZW5nYWdlIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKGRlbGliZGVtMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInYyeF9kZWxpYmRlbSIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogICMgQ29udHJvbCBWYXJpYWJsZXMNCiAgbXV0YXRlKHBvbGl0eTEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJlX2ZoX2lwb2xpdHkyIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKGdkcDEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJlX0dEUF9QZXJfQ2FwX0hhYmVyX01lbl8yIikpICU+JSAjSElFUiBNw5xTU1RFIE1BTiA4IEpBSFJFIEdEUCBhdXN3w6RobGVuDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUocml3MTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoImVfdjJ4X3JlZ2ltZV9jaSIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShjb3JlY2l2aWwxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygidjJ4Y3NfY2NzaSIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShwb3AxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygiZV9taXBvcHVsYSIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShjb3JydXB0aW9uMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInYyeF9jb3JyIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKHBvbGtpbGwxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygidjJ4X2NscGh5IikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKGVkdWMxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygiZV9wZWF2ZWR1YyIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShnaW5pMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoImVfcGVnaW5pd2kiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JSANCiAgIyBEdW1teSB2YXJpYWJsZXMNCiAgbXV0YXRlKHBvbF9yb3VuZCA9IHJvdW5kKHBvbGl0eTEwICogMiAtMTApKSAlPiUgDQogIG11dGF0ZShwb2xpdHlfZGVtZHVtbXkgPSBpZmVsc2UocG9sX3JvdW5kID4gNSwgMSwgMCkpICU+JSANCiAgbXV0YXRlKHBvbGl0eV9hbm9kdW1teSA9IGlmZWxzZShwb2xfcm91bmQgPj0gLTUgJiBwb2xfcm91bmQgPD0gNSwgMSwgMCkpICU+JSANCiAgbXV0YXRlKHBvbGl0eV9hdXRvZHVtbXkgPSBpZmVsc2UocG9sX3JvdW5kIDwgLTUsIDEsIDApKSAlPiUgDQogIG11dGF0ZShyZWdpbWUgPSBjYXNlX3doZW4oDQogICAgcG9saXR5X2F1dG9kdW1teSA9PSAxIH4gImF1dG8iLA0KICAgIHBvbGl0eV9hbm9kdW1teSA9PSAxIH4gImFubyIsDQogICAgcG9saXR5X2RlbWR1bW15ID09IDEgfiAiZGVtbyINCiAgICApDQogICkgJT4lDQogIG11dGF0ZShyZWdpbWUgPSBmYWN0b3IocmVnaW1lLCBsZXZlbHMgPSBjKCJkZW1vIiwgImFubyIsICJhdXRvIikpKSAlPiUgDQogIG11dGF0ZShjbnRyeSA9IGNvdW50cnljb2RlKGNudHJ5LCJjb3VudHJ5Lm5hbWUuZW4iLCJjb3VudHJ5Lm5hbWUuZW4iKSkNCg0KdmRlbSRjbnRyeVs0MF0gPC0gIlZpZXQgTmFtIg0KDQoNCiMgaWZlbHNlKHJvdW5kKHZkZW0kcG9saXR5MTAgKiAyIC0xMCkgPj0gLTUgJiByb3VuZCh2ZGVtJHBvbGl0eTEwICogMiAtMTApIDw9IDUsIDEsIDApDQoNCnRhYmxlKHZkZW0kcmVnaW1lKQ0KcHJpbnQobGV2ZWxzKHZkZW0kcmVnaW1lKSkgDQoNCg0KDQogIA0KYGBgDQoNCiMjIyBUbyBEbyAtIFJlZ2lvbnMNCg0KYGBge3J9DQogIG11dGF0ZShyZWdpb25zID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJlX3JlZ2lvbnBvbCIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KCcyMDAwJykgJT4lIA0KICAgICAgICAgICBtdXRhdGUocmVnaW9ucyA9IGZjdF9yZWNvZGUoYXMuZmFjdG9yKGAyMDAwYCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFLiBFdXJvcGUgYW5kIEMuIEFzaWEgKHBvc3QtQ29tbXVuaXN0KSIgPSAiMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXRpbiBBbWVyaWNhICYgQ2FycmliZWFuIiA9ICIyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1FTkEiID0gIjMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3ViLVNhaGFyYW4gQWZyaWNhIiA9ICI0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlcuIEV1cm9wZSBhbmQgTi4gQW1lcmljYSIgPSAiNSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb3V0aCAmIEVhc3QgQXNpYSAmIFBhY2lmaWMiID0gIjYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU291dGggJiBFYXN0IEFzaWEgJiBQYWNpZmljIiA9ICI3IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoICYgRWFzdCBBc2lhICYgUGFjaWZpYyIgPSAiOCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb3V0aCAmIEVhc3QgQXNpYSAmIFBhY2lmaWMiID0gIjkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGF0aW4gQW1lcmljYSAmIENhcnJpYmVhbiIgPSAiMTAiKSAgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzX2ZhY3RvcikpICAlPiUNCiAgICAgICAgICAgc2VsZWN0KHJlZ2lvbnMpDQoNCg0KdGFibGUocmVnaW9ucykNCg0KcmVnaW9uczIgPC0gdmRlbXNfc3ViICU+JSANCiAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgIHZhbHVlLnZhcj1jKCJlX3JlZ2lvbnBvbCIpKSAlPiUNCiAgc2VsZWN0KCcyMDAwJykgJT4lIA0KICB0cmFuc211dGUoZmN0X3JlY29kZShhcy5mYWN0b3IoYDIwMDBgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIkUuIEV1cm9wZSBhbmQgQy4gQXNpYSAocG9zdC1Db21tdW5pc3QpIiA9ICIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIkxhdGluIEFtZXJpY2EgJiBDYXJyaWJlYW4iID0gIjIiLA0KICAgICAgICAgICAgICAgICAgICAgICAiTUVOQSIgPSAiMyIsDQogICAgICAgICAgICAgICAgICAgICAgICJTdWItU2FoYXJhbiBBZnJpY2EiID0gIjQiLA0KICAgICAgICAgICAgICAgICAgICAgICAiVy4gRXVyb3BlIGFuZCBOLiBBbWVyaWNhIiA9ICI1IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIkVhc3QgQXNpYSIgPSAiNiIsDQogICAgICAgICAgICAgICAgICAgICAgICJTb3V0aC1FYXN0IEFzaWEiID0gIjciLA0KICAgICAgICAgICAgICAgICAgICAgICAiU291dGggQXNpYSIgPSAiOCIsDQogICAgICAgICAgICAgICAgICAgICAgICJQYWNpZmljIiA9ICI5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIkxhdGluIEFtZXJpY2EgJiBDYXJyaWJlYW4iID0gIjEwIikpDQoNCnRhYmxlKHJlZ2lvbnMyKQ0KDQpyZWdpb25zMyA8LSBkY2FzdCh2ZGVtc19zdWIsIGNvdW50cnlfbmFtZSB+IHllYXIsIHZhbHVlLnZhcj1jKCJlX3JlZ2lvbnBvbCIpKSQiMjAwMCINCg0KcG9zdGNvbSAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gMSkNCmxhdGluICAgICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDIgfCByZWdpb25zMyA9PSAxMCkNCm1lbmEgICAgICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDMpDQpzdWJzYWhhcmEgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSA0KQ0Kd2VzdCAgICAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gNSkNCmUuYXNpYSAgICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDYpDQpzLmUuYXNpYSAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSA3KQ0Kcy5hc2lhICAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gOCkNCnBhY2lmaWMgICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDkpDQoNCg0Kd3cgPC0gdmRlbXNfc3ViICU+JSANCiAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJlX3JlZ2lvbnBvbCIpKSAlPiUNCiAgc2VsZWN0KCcyMDAwJykgJT4lIA0KICBtdXRhdGUocmVnaW9ucyA9IGZjdF9yZWNvZGUoYXMuZmFjdG9yKGAyMDAwYCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFLiBFdXJvcGUgYW5kIEMuIEFzaWEgKHBvc3QtQ29tbXVuaXN0KSIgPSAiMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXRpbiBBbWVyaWNhICYgQ2FycmliZWFuIiA9ICIyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1FTkEiID0gIjMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3ViLVNhaGFyYW4gQWZyaWNhIiA9ICI0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlcuIEV1cm9wZSBhbmQgTi4gQW1lcmljYSIgPSAiNSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb3V0aCAmIEVhc3QgQXNpYSAmIFBhY2lmaWMiID0gIjYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU291dGggJiBFYXN0IEFzaWEgJiBQYWNpZmljIiA9ICI3IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoICYgRWFzdCBBc2lhICYgUGFjaWZpYyIgPSAiOCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb3V0aCAmIEVhc3QgQXNpYSAmIFBhY2lmaWMiID0gIjkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGF0aW4gQW1lcmljYSAmIENhcnJpYmVhbiIgPSAiMTAiKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc19mYWN0b3IoKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChyZWdpb25zKQ0KDQp3dw0KDQpyZWdpb25zMiA8LSB2ZGVtc19zdWIgJT4lIA0KICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgdmFsdWUudmFyPWMoImVfcmVnaW9ucG9sIikpICU+JQ0KICBzZWxlY3QoJzIwMDAnKSAlPiUgDQogIHRyYW5zbXV0ZShmY3RfcmVjb2RlKGFzLmZhY3RvcihgMjAwMGApLA0KICAgICAgICAgICAgICAgICAgICAgICAiRS4gRXVyb3BlIGFuZCBDLiBBc2lhIChwb3N0LUNvbW11bmlzdCkiID0gIjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAiTGF0aW4gQW1lcmljYSAmIENhcnJpYmVhbiIgPSAiMiIsDQogICAgICAgICAgICAgICAgICAgICAgICJNRU5BIiA9ICIzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlN1Yi1TYWhhcmFuIEFmcmljYSIgPSAiNCIsDQogICAgICAgICAgICAgICAgICAgICAgICJXLiBFdXJvcGUgYW5kIE4uIEFtZXJpY2EiID0gIjUiLA0KICAgICAgICAgICAgICAgICAgICAgICAiRWFzdCBBc2lhIiA9ICI2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoLUVhc3QgQXNpYSIgPSAiNyIsDQogICAgICAgICAgICAgICAgICAgICAgICJTb3V0aCBBc2lhIiA9ICI4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlBhY2lmaWMiID0gIjkiLA0KICAgICAgICAgICAgICAgICAgICAgICAiTGF0aW4gQW1lcmljYSAmIENhcnJpYmVhbiIgPSAiMTAiKSkNCg0KdGFibGUocmVnaW9uczIpDQoNCnJlZ2lvbnMzIDwtIGRjYXN0KHZkZW1zX3N1YiwgY291bnRyeV9uYW1lIH4geWVhciwgdmFsdWUudmFyPWMoImVfcmVnaW9ucG9sIikpJCIyMDAwIg0KDQpwb3N0Y29tICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSAxKQ0KbGF0aW4gICAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gMiB8IHJlZ2lvbnMzID09IDEwKQ0KbWVuYSAgICAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gMykNCnN1YnNhaGFyYSA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDQpDQp3ZXN0ICAgICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSA1KQ0KZS5hc2lhICAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gNikNCnMuZS5hc2lhICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDcpDQpzLmFzaWEgICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSA4KQ0KcGFjaWZpYyAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gOSkNCg0KDQoNCmBgYA0KDQoNCiMjIFFvRw0KDQpgYGB7cn0NCmxvYWQocW9nX3VybCkNCg0KcW9nMTAgPC0gcW9nICU+JSANCiAgZmlsdGVyKHllYXIgJWluJSAyMDAwOjIwMTApICU+JSANCiAgbXV0YXRlKGNudHJ5ID0gY291bnRyeWNvZGUoY2NvZGVjb3csICJjb3duIiwiY291bnRyeS5uYW1lLmVuIikpDQoNCnFvZzEwIDwtIHFvZyAlPiUgDQogIGZpbHRlcih5ZWFyICVpbiUgMjAwMDoyMDEwKSAlPiUgDQogIG11dGF0ZShjbnRyeSA9IGNvdW50cnljb2RlKGNjb2RlY293LCAiY293biIsImNvdW50cnkubmFtZS5lbiIpKSAlPiUgDQogIGdyb3VwX2J5KGNudHJ5KSAlPiUNCiAgdGFsbHkoKSAlPiUgDQogIG11dGF0ZShldGhuaWMxMCA9IHFvZzEwICU+JQ0KICAgICAgICAgICBkY2FzdChjbnRyeSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygiYWxfZXRobmljIiksIA0KICAgICAgICAgIGZ1bi5hZ2dyZWdhdGUgPSBtZWFuKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lIA0KICBzZWxlY3QoLW4pDQojICBtdXRhdGUoYWxfZXRobmljID0gYXMubnVtZXJpYyhhbF9ldGhuaWMpKSAlPiUgDQoNCnFvZzEwDQoNCg0KDQpgYGANCg0KIyMgTWVyZ2luZyBUaW1lDQoNCiMjIyBMZXZlbCAyDQoNCmBgYHtyfQ0KbGV2ZWwyIDwtIG1lcmdlKHg9cW9nMTAsIHk9dmRlbSwgYnk9ImNudHJ5IikNCg0KbGV2ZWwyDQpgYGANCg0KIyMjIEluZCArIENvdW50cnkNCg0KYGBge3J9DQoNCmNvbWJpbmVkIDwtIG1lcmdlKHg9bWVyZ2VkLCB5PWxldmVsMiwgYnk9ImNudHJ5IikgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoY250cnllYXJzID0gcGFzdGUoY250cnksIHllYXIpKQ0KDQojY29tYmluZWQkY250cnllYXJzIDwtIHBhc3RlKGNvbWJpbmVkJGNudHJ5LGNvbWJpbmVkJHllYXIpDQoNCg0KdmRlbTIgPC0gdmRlbXNfc3RhcnQgJT4lDQogIGZpbHRlcih5ZWFyICVpbiUgMjAxMDoyMDE1KSAlPiUgDQogIG11dGF0ZShjbnRyeSA9IGNvdW50cnljb2RlKGNvdW50cnlfbmFtZSwiY291bnRyeS5uYW1lLmVuIiwiY291bnRyeS5uYW1lLmVuIikpICMlPiUgDQogIyBzZWxlY3QoY250cnksIGNvdW50cnlfbmFtZSkNCg0KdmRlbTIkY250cnlbOTk2XSA8LSAiVmlldCBOYW0iDQp2ZGVtMiRjbnRyeVs5OTddIDwtICJWaWV0IE5hbSINCnZkZW0yJGNudHJ5Wzk5OF0gPC0gIlZpZXQgTmFtIg0KdmRlbTIkY250cnlbOTk5XSA8LSAiVmlldCBOYW0iDQp2ZGVtMiRjbnRyeVsxMDAwXSA8LSAiVmlldCBOYW0iDQp2ZGVtMiRjbnRyeVsxMDAxXSA8LSAiVmlldCBOYW0iDQoNCmNvbWJpbmVkIDwtIHZkZW0yICU+JSANCiAgbXV0YXRlKGNudHJ5ZWFycyA9IHBhc3RlKGNudHJ5LCB5ZWFyKSkgJT4lIA0KICBtdXRhdGUoZGlzY3Vzc191bnNlbCA9IHYyeGNsX2Rpc2MpICU+JSANCiAgc2VsZWN0KGNudHJ5ZWFycywgZGlzY3Vzc191bnNlbCkgJT4lIA0KICBtZXJnZShjb21iaW5lZCwgYnkgPSAiY250cnllYXJzIikgJT4lIA0KICAgICAgICAgICAgICAgICAgcGx5cjo6ZGRwbHkofmNudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2N1c3MgPSBtZWFuKGRpc2N1c3NfdW5zZWwsIG5hLnJtPVQpKSAlPiUgDQogIG1lcmdlKGNvbWJpbmVkLCBieSA9ICJjbnRyeSIpDQoNCg0KY29tYmluZWQNCg0KDQpzYXZlKGNvbWJpbmVkLGZpbGU9ImNvbWJpbmVkLlJkYXRhIikNCnNhdmUobGV2ZWwyLGZpbGU9ImxldmVsMi5SZGF0YSIpDQpgYGANCg0KDQojIFdlaWdodGluZw0KDQojIyBNYWNybyBMZXZlbA0KDQpgYGB7cn0NCg0KbWFjcm8gIDwtIGNvbWJpbmVkICU+JSANCiAgICAgICAgICAgICAgICBtdXRhdGUoZ292X3RydXN0ID0gcmFuZ2UwMShnb3ZfdHJ1c3QpKjEwMCkgJT4lIA0KICAgICAgICAgICAgICAgIG11dGF0ZShkZW10b2RheSA9IHJhbmdlMDEoZGVtdG9kYXkpKjEwMCkgJT4lIA0KICAgICAgICAgICAgICAgIHBseXI6OmRkcGx5KH5jbnRyeSwNCiAgICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZSwNCiAgICAgICAgICAgICAgICAgICAgIG1lYW5fZ292ID0gbWVhbihnb3ZfdHJ1c3QsIG5hLnJtPVQpLA0KICAgICAgICAgICAgICAgICAgICAgbWVhbl9kZW0gPSBtZWFuKGRlbXRvZGF5LCBuYS5ybT1UKSwNCiAgICAgICAgICAgICAgICAgICAgIGRpc2N1c3MgPSBtZWFuKGRpc2N1c3MsIG5hLnJtPVQpKSAlPiUgDQojICAgICAgICAgICAgICAgICAgICAgcG9saXR5MTAgPSBtZWFuKHBvbGl0eTEwLCBuYS5ybT1UKSwNCiMgICAgICAgICAgICAgICAgICAgICBwb2xpdHlfZGVtZHVtbXkgPSBtZWFuKHBvbGl0eV9kZW1kdW1teSwgbmEucm09VCkpICU+JSANCiAgICAgICAgICAgICAgICBtdXRhdGUoZGlzY3Vzc19yb3VuZCA9IHJvdW5kKGRpc2N1c3MqNCkpICU+JSANCiAgICAgICAgICAgICAgICBtdXRhdGUobWVhbl9nb3ZfbG93ID0gY2FzZV93aGVuKA0KICAgICAgICAgICAgICAgICAgICAgIGRpc2N1c3Nfcm91bmQgPT0gMiB+IG1lYW5fZ292ICogLjksDQogICAgICAgICAgICAgICAgICAgICAgZGlzY3Vzc19yb3VuZCA9PSAxIH4gbWVhbl9nb3YgKiAuODUsDQogICAgICAgICAgICAgICAgICAgICAgZGlzY3Vzc19yb3VuZCAlaW4lIGMoMyw0KSB+IG1lYW5fZ292KSkgJT4lIA0KICAgICAgICAgICAgICAgIG11dGF0ZShtZWFuX2dvdl9oaWdoID0gY2FzZV93aGVuKA0KICAgICAgICAgICAgICAgICAgICAgIGRpc2N1c3Nfcm91bmQgPT0gMiB+IG1lYW5fZ292ICogLjgsDQogICAgICAgICAgICAgICAgICAgICAgZGlzY3Vzc19yb3VuZCA9PSAxIH4gbWVhbl9nb3YgKiAuNzUsDQogICAgICAgICAgICAgICAgICAgICAgZGlzY3Vzc19yb3VuZCAlaW4lIGMoMyw0KSB+IG1lYW5fZ292KSkgJT4lIA0KICAgICAgICAgICAgICAgIG1lcmdlKGxldmVsMiwgYnkgPSAiY250cnkiKSAlPiUgDQogICAgICAgICAgICAgICAgbXV0YXRlX2F0KHZhcnMoY29tbW9uMTAsIHJlYXNvbjEwLCBjb25zdWx0MTAsIA0KICAgICAgICAgICAgICAgICBjb3VudHIxMCwgZW5nYWdlMTAsIGVuZ2FnZTEwLCBkZWxpYjEwKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTAxKQ0KDQptYWNyb19kZW0gPC0gbWFjcm8gJT4lIA0KICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihwb2xpdHlfZGVtZHVtbXkgPT0gMSkNCg0KbWFjcm9fYXV0IDwtIG1hY3JvICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIocG9saXR5X2RlbWR1bW15ID09IDApDQoNCiMgdGFibGVfc3R1ZmYyPC1zdWJzZXQodGFibGVfc3R1ZmYsDQojICAgICAgICAgICAgICAgICAgICAgICFpcy5uYSh0YWJsZV9zdHVmZiRyZWdpbWUpICYNCiMgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9zdHVmZiRjbnRyeSE9IlFhdGFyIiAmDQojICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9zdHVmZiRjbnRyeSE9IlV6YmVraXN0YW4iKQ0KDQoNCnNhdmUobWFjcm8sIGZpbGU9Im1hY3JvLlJkYXRhIikNCnNhdmUobWFjcm9fZGVtLCBmaWxlPSJtYWNyb19kZW0uUmRhdGEiKQ0Kc2F2ZShtYWNyb19hdXQsIGZpbGU9Im1hY3JvX2F1dC5SZGF0YSIpDQoNCmBgYA0KDQojIyBJbmRpdmlkdWFsIExldmVsDQoNCmBgYHtyfQ0KY29tYmluZWQgIDwtIGNvbWJpbmVkICU+JSANCiAgICAgICAgICAgICAgICBtdXRhdGUoZGlzY3Vzc19yb3VuZCA9IHJvdW5kKGRpc2N1c3MqNCkpICU+JSANCiAgICAgICAgICAgICAgICBtdXRhdGUoZ292X3RydXN0X2xvdyA9IGNhc2Vfd2hlbigNCiAgICAgICAgICAgICAgICAgICAgICBkaXNjdXNzX3JvdW5kID09IDIgfiBnb3ZfdHJ1c3QgKiAuOSwNCiAgICAgICAgICAgICAgICAgICAgICBkaXNjdXNzX3JvdW5kID09IDEgfiBnb3ZfdHJ1c3QgKiAuODUsDQogICAgICAgICAgICAgICAgICAgICAgZGlzY3Vzc19yb3VuZCAlaW4lIGMoMyw0KSB+IGdvdl90cnVzdCkpICU+JSANCiAgICAgICAgICAgICAgICBtdXRhdGUoZ292X3RydXN0X2hpZ2ggPSBjYXNlX3doZW4oDQogICAgICAgICAgICAgICAgICAgICAgZGlzY3Vzc19yb3VuZCA9PSAyIH4gZ292X3RydXN0ICogLjgsDQogICAgICAgICAgICAgICAgICAgICAgZGlzY3Vzc19yb3VuZCA9PSAxIH4gZ292X3RydXN0ICogLjc1LA0KICAgICAgICAgICAgICAgICAgICAgIGRpc2N1c3Nfcm91bmQgJWluJSBjKDMsNCkgfiBnb3ZfdHJ1c3QpKSAlPiUgDQogICAgICAgICAgICAgICAgbXV0YXRlX2F0KHZhcnMoY29tbW9uMTAsIHJlYXNvbjEwLCBjb25zdWx0MTAsIA0KICAgICAgICAgICAgICAgICBjb3VudHIxMCwgZW5nYWdlMTAsIGVuZ2FnZTEwLCBkZWxpYjEwKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTAxKQ0KDQpzYXZlKGNvbWJpbmVkLGZpbGU9ImNvbWJpbmVkLlJkYXRhIikNCg0KYGBgDQoNCg0KIyBDcmFwDQoNCmBgYHtyfQ0KDQpjb21wYXJlX2NudHJ5PC1kYXRhLmZyYW1lKHRhYmxlKG1lcmdlZCRjbnRyeSxtZXJnZWQkeWVhcikpDQpjb21wYXJlX2NudHJ5PC10aWR5cjo6c3ByZWFkKGNvbXBhcmVfY250cnksVmFyMixGcmVxKQ0KY29tcGFyZV9jbnRyeVtjb21wYXJlX2NudHJ5PT0wXTwtMTAwMDAwDQojY29tcGFyZV9jbnRyeTwtbmEub21pdChjb21wYXJlX2NudHJ5KQ0KaW5kaWU8LWFzLm51bWVyaWMoYXBwbHkoY29tcGFyZV9jbnRyeVssLTFdLDEsc3VtKSkNCmNvbXBhcmVfY250cnkkZG91YmxlPC1pbmRpZTw5MDAwMDANCmNvbXBhcmVfY250cnlbY29tcGFyZV9jbnRyeT09MTAwMDAwXTwtMA0KY29tcGFyZV9jbnRyeTIgPC0gc3Vic2V0KGNvbXBhcmVfY250cnksY29tcGFyZV9jbnRyeSRkb3VibGU9PVRSVUUpDQoNCmNvbXBhcmVfY250cnkzIDwtIHN1YnNldChtZXJnZWQsbWVyZ2VkJGNudHJ5ICVpbiUgY29tcGFyZV9jbnRyeTIkVmFyMSkNCg0KeTE8LXN1YnNldChjb21wYXJlX2NudHJ5Myxjb21wYXJlX2NudHJ5MyRjbnRyeT09IkJlbGl6ZSIgJg0KICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVfY250cnkzJHllYXI9PTIwMTIpJGdvdl90cnVzdA0KDQp5Mjwtc3Vic2V0KGNvbXBhcmVfY250cnkzLGNvbXBhcmVfY250cnkzJGNudHJ5PT0iQmVsaXplIiAmDQogICAgICAgICBjb21wYXJlX2NudHJ5MyR5ZWFyPT0yMDE0KSRnb3ZfdHJ1c3QNCg0KdC50ZXN0KHkxLHkyKQ0KDQp5MTwtc3Vic2V0KGNvbXBhcmVfY250cnkzLGNvbXBhcmVfY250cnkzJGNudHJ5PT0iQm9saXZpYSAoUGx1cmluYXRpb25hbCBTdGF0ZSBvZikiICYNCiAgICAgICAgICAgICBjb21wYXJlX2NudHJ5MyR5ZWFyPT0yMDEyKSRnb3ZfdHJ1c3QNCg0KeTI8LXN1YnNldChjb21wYXJlX2NudHJ5Myxjb21wYXJlX2NudHJ5MyRjbnRyeT09IkJvbGl2aWEgKFBsdXJpbmF0aW9uYWwgU3RhdGUgb2YpIiAmDQogICAgICAgICAgICAgY29tcGFyZV9jbnRyeTMkeWVhcj09MjAxMykkZ292X3RydXN0DQoNCnQudGVzdCh5MSx5MikNCg0KeTE8LXN1YnNldChjb21wYXJlX2NudHJ5Myxjb21wYXJlX2NudHJ5MyRjbnRyeT09IlNvdXRoIEFmcmljYSIgJg0KICAgICAgICAgICAgIGNvbXBhcmVfY250cnkzJHllYXI9PTIwMTEpJGdvdl90cnVzdA0KDQp5Mjwtc3Vic2V0KGNvbXBhcmVfY250cnkzLGNvbXBhcmVfY250cnkzJGNudHJ5PT0iU291dGggQWZyaWNhIiAmDQogICAgICAgICAgICAgY29tcGFyZV9jbnRyeTMkeWVhcj09MjAxMykkZ292X3RydXN0DQoNCnQudGVzdCh5MSx5MikNCg0KICAgICAgIA0Kc3Vic2V0KG1lcmdlZCxtZXJnZWQkeWVhcj09MjAxMikNCg0KbGlicmFyeShkcGx5cikNCmNvbXBhcmVfY250cnk0IDwtIGNvbXBhcmVfY250cnkzICU+JQ0KICBncm91cF9ieShjbnRyeSx5ZWFyKSAlPiUNCiAgc3VtbWFyaXNlX2FsbChmdW5zKG1lYW4oLiwgbmEucm09VFJVRSkpKQ0KDQpjb21wYXJlX2NudHJ5NCRjbnRyeWVhcjwtcGFzdGUoY29tcGFyZV9jbnRyeTQkY250cnksY29tcGFyZV9jbnRyeTQkeWVhcikNCiAgDQphcy5kYXRhLmZyYW1lKGNvbXBhcmVfY250cnk0WyxjKDE3LDgpXSkNCiAgDQo/ZGRwbHkNCmhlYWQoYWZybykNCg0KYWZyb2NudHJ5PC11bmlxdWUoYWZybyRjbnRyeSkNCmxhdGlub2NudHJ5PC11bmlxdWUobGF0aW5vMjAxMyRjbnRyeSkNCmFyYWJjbnRyeTwtdW5pcXVlKGFyYWIzJGNudHJ5KQ0Kd3ZzY250cnk8LXVuaXF1ZSh3dnMkY250cnkpDQoNCmNudHJ5X3RhYmxlPC0gZGF0YS5mcmFtZShhcy5jaGFyYWN0ZXIod3ZzY250cnkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGMoYXMuY2hhcmFjdGVyKGFyYWJjbnRyeSkscmVwKCItIiw0OCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGMoYXMuY2hhcmFjdGVyKGxhdGlub2NudHJ5KSxyZXAoIi0iLDQxKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgYyhhcy5jaGFyYWN0ZXIoYWZyb2NudHJ5KSxyZXAoIi0iLDI0KSkpDQoNCmNvbG5hbWVzKGNudHJ5X3RhYmxlKSA8LSBjKCJ3dnMiLCJhcmFiIiwibGF0aW5vIiwiYWZybyIpDQoNCmFycmFuZ2UoY250cnlfdGFibGUsIHd2cywgYWZybykNCg0KDQoNCnRhYmxlKGNvbWJpbmVkJHBvbGl0Y2F0LngpDQptcGx1c2RhdGEgPC0gY29tYmluZWQgJT4lIGRwbHlyOjpzZWxlY3QoY250cnksIGRlbGliMTAsIGRlbXRvZGF5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSx0cnVzdF9jb3VydHMsd2VpZ2h0KQ0KbXBsdXNkYXRhIDwtIG5hLm9taXQobXBsdXNkYXRhKQ0KbXBsdXNkYXRhJGNudHJ5IDwtIGFzLm51bWVyaWMobXBsdXNkYXRhJGNudHJ5KQ0Kd3JpdGVfY3N2KG1wbHVzZGF0YSwgcGF0aCA9ICJtcGx1c2RhdGEuY3N2IiwgY29sX25hbWVzID0gRikNCg0KbXBsdXNkYXRhMiA8LSBjb21iaW5lZCAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSwgZGVsaWIxMCwgZGVtdG9kYXksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdl90cnVzdCx3ZWlnaHQpDQptcGx1c2RhdGEyIDwtIG5hLm9taXQobXBsdXNkYXRhMikNCm1wbHVzZGF0YTIkY250cnkgPC0gYXMubnVtZXJpYyhtcGx1c2RhdGEyJGNudHJ5KQ0Kd3JpdGVfY3N2KG1wbHVzZGF0YTIsIHBhdGggPSAibXBsdXNkYXQyYS5jc3YiLCBjb2xfbmFtZXMgPSBGKQ0KDQptcGx1c2RhdGEyX2RlbSA8LSBjb21iaW5lZF9kZW0gJT4lIGRwbHlyOjpzZWxlY3QoY250cnksIGRlbGliMTAsIGRlbXRvZGF5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ292X3RydXN0LHdlaWdodCkNCm1wbHVzZGF0YTJfZGVtIDwtIG5hLm9taXQobXBsdXNkYXRhMl9kZW0pDQptcGx1c2RhdGEyX2RlbSRjbnRyeSA8LSBhcy5udW1lcmljKG1wbHVzZGF0YTJfZGVtJGNudHJ5KQ0Kd3JpdGVfY3N2KG1wbHVzZGF0YTJfZGVtLCBwYXRoID0gIm1wbHVzZGF0Ml9kZW1hLmNzdiIsIGNvbF9uYW1lcyA9IEYpDQoNCm1wbHVzZGF0YTJfYXV0IDwtIGNvbWJpbmVkX2F1dCAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSwgZGVsaWIxMCwgZGVtdG9kYXksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3ZfdHJ1c3Qsd2VpZ2h0KQ0KbXBsdXNkYXRhMl9hdXQgPC0gbmEub21pdChtcGx1c2RhdGEyX2F1dCkNCm1wbHVzZGF0YTJfYXV0JGNudHJ5IDwtIGFzLm51bWVyaWMobXBsdXNkYXRhMl9hdXQkY250cnkpDQp3cml0ZV9jc3YobXBsdXNkYXRhMl9hdXQsIHBhdGggPSAibXBsdXNkYXQyX2F1dGEuY3N2IiwgY29sX25hbWVzID0gRikNCg0KY29tYmluZWQgPC0gbWVyZ2UoY29tYmluZWQsIHBoeXNpMl9zLCBieSA9ICJjbnRyeSIpDQoNCmNvbWJpbmVkX2RlbSA8LSBzdWJzZXQoY29tYmluZWQsY29tYmluZWQkcG9saXR5X2RlbWR1bW15PT0xKQ0KDQptcGx1c2RhdGFfZGVtIDwtIGNvbWJpbmVkX2RlbSAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSwgZGVsaWIxMCwgZGVtdG9kYXksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLHRydXN0X2NvdXJ0cyx3ZWlnaHQpDQptcGx1c2RhdGFfZGVtIDwtIG5hLm9taXQobXBsdXNkYXRhX2RlbSkNCm1wbHVzZGF0YV9kZW0kY250cnkgPC0gYXMubnVtZXJpYyhtcGx1c2RhdGFfZGVtJGNudHJ5KQ0Kd3JpdGVfY3N2KG1wbHVzZGF0YV9kZW0sIHBhdGggPSAibXBsdXNkYXRhX2RlbS5jc3YiLCBjb2xfbmFtZXMgPSBGKQ0KDQoNCmNvbWJpbmVkX2F1dCA8LSBzdWJzZXQoY29tYmluZWQsY29tYmluZWQkcG9saXR5X2RlbWR1bW15PT0wKQ0KDQptcGx1c2RhdGFfYXV0IDwtIGNvbWJpbmVkX2F1dCAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSwgZGVsaWIxMCwgZGVtdG9kYXksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSx0cnVzdF9jb3VydHMsd2VpZ2h0KQ0KbXBsdXNkYXRhX2F1dCA8LSBuYS5vbWl0KG1wbHVzZGF0YV9hdXQpDQptcGx1c2RhdGFfYXV0JGNudHJ5IDwtIGFzLm51bWVyaWMobXBsdXNkYXRhX2F1dCRjbnRyeSkNCndyaXRlX2NzdihtcGx1c2RhdGFfYXV0LCBwYXRoID0gIm1wbHVzZGF0YV9hdXQuY3N2IiwgY29sX25hbWVzID0gRikNCg0KDQojZGF0YV93aWRzIDwtIGRjYXN0KG1lcmdlZCwgY250cnl+eWVhciwgDQojICAgICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygieWVhciIpKQ0KI2RhdGFfd2lkczIgPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkoZGF0YV93aWRzWywtMV0sZnVuY3Rpb24obikgMDxuKSkNCiNkYXRhX3dpZHMzIDwtIGFzLmRhdGEuZnJhbWUoYXBwbHkoZGF0YV93aWRzMiwyLGFzLm51bWVyaWMpKQ0KI2RhdGFfd2lkczMgPC0gY2JpbmQoZGF0YV93aWRzWywxXSxkYXRhX3dpZHMzKQ0KI25hbWVzKGRhdGFfd2lkczMpWzFdPC0iY250cnkiDQojdGFibGVfc3R1ZmYgPC0gbWVyZ2UoZGF0YV93aWRzMyAsdGFibGVfc3R1ZmYsIGJ5PSJjbnRyeSIpDQoNCiN0YWJsZV9zdHVmZiRwb2xpdHkxMFt0YWJsZV9zdHVmZiRjbnRyeT09IlR1bmlzaWEiXSA8LSA1LjMyMzgyDQojdGFibGVfc3R1ZmYyJHBvbGl0eTEwW3RhYmxlX3N0dWZmMiRjbnRyeT09IlR1bmlzaWEiXSA8LSA1LjMyMzgyDQoNCmhlYWQodGFibGVfc3R1ZmYpDQpjb3IobmEub21pdChkYXRhLmZyYW1lKHRhYmxlX3N0dWZmJGxlZ2l0LHRhYmxlX3N0dWZmJGxlZ2l0Mix0YWJsZV9zdHVmZiRsZWdpdDMsDQogICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX3N0dWZmJG1lYW5fZ292KSkpDQoNCnRhYmxlX3N0dWZmJGduaSA8LSB0YWJsZV9zdHVmZiRnbmlfYw0KDQp0YWJsZV9zdHVmZiRnbmlfY1t0YWJsZV9zdHVmZiRnbmkgPD0gMTAyNV0gPC0gImxvdyINCnRhYmxlX3N0dWZmJGduaV9jW3RhYmxlX3N0dWZmJGduaSA+IDEwMjYgJiB0YWJsZV9zdHVmZiRnbmkgPD0gNDAzNV0gPC0gImxvd2VyLW1pZGRsZSINCnRhYmxlX3N0dWZmJGduaV9jW3RhYmxlX3N0dWZmJGduaSA+IDQwMzYgJiB0YWJsZV9zdHVmZiRnbmkgPD0gMTI0NzVdIDwtICJ1cHBlci1taWRkbGUiDQp0YWJsZV9zdHVmZiRnbmlfY1t0YWJsZV9zdHVmZiRnbmkgPiAxMjQ3NV0gPC0gImhpZ2giDQoNCnRhYmxlX3N0dWZmJGduaV9jMiA8LSB0YWJsZV9zdHVmZiRnbmlfYw0KDQp0YWJsZV9zdHVmZiRnbmlfYzJbdGFibGVfc3R1ZmYkZ25pX2MgPT0gImxvd2VyLW1pZGRsZSJdIDwtICJsb3ciDQp0YWJsZV9zdHVmZiRnbmlfYzJbdGFibGVfc3R1ZmYkZ25pX2MgPT0gInVwcGVyLW1pZGRsZSJdIDwtICJoaWdoIg0KDQp0YWJsZSh0YWJsZV9zdHVmZiRnbmlfYykNCnRhYmxlKHRhYmxlX3N0dWZmJGduaV9jMikNCg0KVGhlIGN1dC1vZmYgcG9pbnRzIGFyZSBIREkgb2YgbGVzcyB0aGFuIDAuNTUwDQpmb3IgbG93IGh1bWFuIGRldmVsb3BtZW50LCAwLjU1MC0wLjY5OSBmb3IgbWVkaXVtIGh1bWFuDQpkZXZlbG9wbWVudCwgMC43MDAtMC43OTkgZm9yIGhpZ2ggaHVtYW4gZGV2ZWxvcG1lbnQgYW5kDQowLjgwMCBvciBncmVhdGVyIGZvciB2ZXJ5IGhpZ2ggaHVtYW4gZGV2ZWxvcG1lbnQuDQoNCiN0YWJsZV9zdHVmZiRoZGlfYyA8LSB0YWJsZV9zdHVmZiRoZGkNCg0KI3RhYmxlX3N0dWZmJGhkaV9jW3RhYmxlX3N0dWZmJGhkaSA8IDAuNTUwXSA8LSAibG93Ig0KI3RhYmxlX3N0dWZmJGhkaV9jW3RhYmxlX3N0dWZmJGhkaSA+PSAwLjU1MCAmIHRhYmxlX3N0dWZmJGhkaSA8PSAwLjY5OV0gPC0gIm1lZGl1bSINCiN0YWJsZV9zdHVmZiRoZGlfY1t0YWJsZV9zdHVmZiRoZGkgPj0gMC43MDAgJiB0YWJsZV9zdHVmZiRoZGkgPD0gMC44OTldIDwtICJoaWdoIg0KI3RhYmxlX3N0dWZmJGhkaV9jW3RhYmxlX3N0dWZmJGhkaSA+PSAwLjkwXSA8LSAidmVyeSBoaWdoIg0KDQojdGFibGUodGFibGVfc3R1ZmYkaGRpX2MpDQoNCg0KDQp0YWJsZShyb3VuZCh0YWJsZV9zdHVmZiR0ZXJyb3IpKQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjIgPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YNCnRhYmxlX3N0dWZmJG1lYW5fZ292Mltpcy5uYSh0YWJsZV9zdHVmZiRtZWFuX2dvdjIpXTwtOTk5DQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292MyA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdg0KdGFibGVfc3R1ZmYkbWVhbl9nb3YzW2lzLm5hKHRhYmxlX3N0dWZmJG1lYW5fZ292MyldPC05OTkNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y0IDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjRbaXMubmEodGFibGVfc3R1ZmYkbWVhbl9nb3Y0KV08LTk5OQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjUgPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YNCnRhYmxlX3N0dWZmJG1lYW5fZ292NVtpcy5uYSh0YWJsZV9zdHVmZiRtZWFuX2dvdjUpXTwtOTk5DQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292NiA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y2W2lzLm5hKHRhYmxlX3N0dWZmJG1lYW5fZ292NildPC05OTkNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y3IDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjdbaXMubmEodGFibGVfc3R1ZmYkbWVhbl9nb3Y3KV08LTk5OQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjggPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YNCnRhYmxlX3N0dWZmJG1lYW5fZ292OFtpcy5uYSh0YWJsZV9zdHVmZiRtZWFuX2dvdjgpXTwtOTk5DQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292OSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y5W2lzLm5hKHRhYmxlX3N0dWZmJG1lYW5fZ292OSldPC05OTkNCg0KdGFibGVfc3R1ZmYkcGh5c3Zpb2wyIDwtIHRhYmxlX3N0dWZmJHBoeXN2aW9sDQp0YWJsZV9zdHVmZiRwaHlzdmlvbDJbaXMubmEodGFibGVfc3R1ZmYkcGh5c3Zpb2wyKV0gPC0gOTk5DQoNCnRhYmxlX3N0dWZmJHRlcnJvcjIgPC0gcm91bmQodGFibGVfc3R1ZmYkdGVycm9yKQ0KdGFibGVfc3R1ZmYkdGVycm9yMltpcy5uYW4odGFibGVfc3R1ZmYkdGVycm9yMildIDwtIDk5OQ0KDQp0YWJsZV9zdHVmZiRkaXNjdXNzMiA8LSByb3VuZCh0YWJsZV9zdHVmZiRkaXNjdXNzKjQpDQp0YWJsZV9zdHVmZiRkaXNjdXNzMltpcy5uYW4odGFibGVfc3R1ZmYkZGlzY3VzczIpXSA8LSA5OTkNCg0KDQoNCnRhYmxlKHRhYmxlX3N0dWZmJHBoeXN2aW9sKQ0KdGFibGVfc3R1ZmYkbWVhbl9nb3YyW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC41ICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuNF0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YyW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC41ICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuNF0tNQ0KdGFibGVfc3R1ZmYkbWVhbl9nb3YyW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC40ICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuM10gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YyW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC40ICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuM10tMTANCnRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMyAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjJdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMyAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjJdLTE1DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjJbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjIgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC4xXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjJbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjIgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC4xXS0yMA0KdGFibGVfc3R1ZmYkbWVhbl9nb3YyW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC4xICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPj0wXSAgPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YyW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC4xICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPj0wXSAgLTI1DQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRtZWFuX2dvdjI+MTAwXSA8LSBOQQ0KdGFibGUodGFibGVfc3R1ZmYkbWVhbl9nb3YyKQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjNbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjUgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC40XSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjNbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjUgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC40XS04DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjNbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjQgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC4zXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjNbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjQgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC4zXS0xNg0KdGFibGVfc3R1ZmYkbWVhbl9nb3YzW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC4zICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuMl0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YzW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC4zICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuMl0tMjQNCnRhYmxlX3N0dWZmJG1lYW5fZ292M1t0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMiAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjFdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292M1t0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMiAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjFdIC0zMg0KdGFibGVfc3R1ZmYkbWVhbl9nb3YzW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC4xICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPj0wXSA8LSAgdGFibGVfc3R1ZmYkbWVhbl9nb3YzW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC4xICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPj0wXSAgLTMwDQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292M1t0YWJsZV9zdHVmZiRtZWFuX2dvdjM+MTAwXSA8LSBOQQ0KdGFibGUodGFibGVfc3R1ZmYkbWVhbl9nb3YzKQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjRbdGFibGVfc3R1ZmYkdGVycm9yMj09NV0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3Y0W3RhYmxlX3N0dWZmJHRlcnJvcjI9PTVdLTUNCnRhYmxlX3N0dWZmJG1lYW5fZ292NFt0YWJsZV9zdHVmZiR0ZXJyb3IyPT00XSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjRbdGFibGVfc3R1ZmYkdGVycm9yMj09NF0tMTANCnRhYmxlX3N0dWZmJG1lYW5fZ292NFt0YWJsZV9zdHVmZiR0ZXJyb3IyPT0zXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjRbdGFibGVfc3R1ZmYkdGVycm9yMj09M10tMTUNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y0W3RhYmxlX3N0dWZmJG1lYW5fZ292ND4xMDBdIDwtIE5BDQp0YWJsZSh0YWJsZV9zdHVmZiRtZWFuX2dvdjQpDQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292NVt0YWJsZV9zdHVmZiR0ZXJyb3IyPT01XSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjVbdGFibGVfc3R1ZmYkdGVycm9yMj09NV0tOA0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y1W3RhYmxlX3N0dWZmJHRlcnJvcjI9PTRdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292NVt0YWJsZV9zdHVmZiR0ZXJyb3IyPT00XS0xNg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y1W3RhYmxlX3N0dWZmJHRlcnJvcjI9PTNdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292NVt0YWJsZV9zdHVmZiR0ZXJyb3IyPT0zXS0yNA0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjVbdGFibGVfc3R1ZmYkbWVhbl9nb3Y1PjEwMF0gPC0gTkENCnRhYmxlKHRhYmxlX3N0dWZmJG1lYW5fZ292NSkNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y2W3RhYmxlX3N0dWZmJGRpc2N1c3MyPT0yXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjZbdGFibGVfc3R1ZmYkZGlzY3VzczI9PTJdIC01DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjZbdGFibGVfc3R1ZmYkZGlzY3VzczI9PTFdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292Nlt0YWJsZV9zdHVmZiRkaXNjdXNzMj09MV0gLTEwDQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292Nlt0YWJsZV9zdHVmZiRtZWFuX2dvdjY+MTAwXSA8LSBOQQ0KdGFibGUodGFibGVfc3R1ZmYkbWVhbl9nb3Y2KQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjdbdGFibGVfc3R1ZmYkZGlzY3VzczI9PTJdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292N1t0YWJsZV9zdHVmZiRkaXNjdXNzMj09Ml0gLTEwDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjdbdGFibGVfc3R1ZmYkZGlzY3VzczI9PTFdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292N1t0YWJsZV9zdHVmZiRkaXNjdXNzMj09MV0gLTIwDQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292N1t0YWJsZV9zdHVmZiRtZWFuX2dvdjc+MTAwXSA8LSBOQQ0KdGFibGUodGFibGVfc3R1ZmYkbWVhbl9nb3Y3KQ0KDQoNCmxvYWQocW9nX3VybCkNCg0KcW9nMTAgPC0gc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAwMCB8DQogICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAwMSB8ICANCiAgICAgICAgICAgICAgICAgIHFvZyR5ZWFyPT0yMDAyIHwgDQogICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAwMyB8IA0KICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMDQgfCANCiAgICAgICAgICAgICAgICAgIHFvZyR5ZWFyPT0yMDA1IHwgDQogICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAwNiB8IA0KICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMDcgfCANCiAgICAgICAgICAgICAgICAgIHFvZyR5ZWFyPT0yMDA4IHwgDQogICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAwOSB8DQogICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAxMCkNCg0KbGlicmFyeShjb3VudHJ5Y29kZSkNCnFvZzEwJGNudHJ5PC1jb3VudHJ5Y29kZShxb2cxMCRjY29kZWNvdywgImNvd24iLCJjb3VudHJ5Lm5hbWUuZW4iKQ0KcW9nMTAkYWxfZXRobmljPC1hcy5udW1lcmljKHFvZzEwJGFsX2V0aG5pYykNCiN0aWR5cjo6Z2F0aGVyKHFvZzEwLGMoImNudHJ5IiwieWVhciIpLCJhbF9ldGhuaWMiKQ0KDQpxb2cxMGEgPC0gcW9nMTAgJT4lIGRwbHlyOjpzZWxlY3QoY250cnkseWVhcixhbF9ldGhuaWMpICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkNCmRhdGFfd2lkZTE3IDwtIHJlc2hhcGUoZGF0YSA9IHFvZzEwYSwNCiAgICAgICAgICAgICAgICAgICAgICAgaWR2YXIgPSAiY250cnkiLA0KICAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWVzID0gImFsX2V0aG5pYyIsDQogICAgICAgICAgICAgICAgICAgICAgIHRpbWV2YXIgPSAieWVhciIsDQogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJ3aWRlIikNCg0KI3FvZzEwaGRpIDwtIHFvZzEwICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsdW5kcF9oZGkpICU+JQ0KIyAgYXMuZGF0YS5mcmFtZSgpDQojZGF0YV93aWRlX2hkaSA8LSBoZGkNCiAgI3Jlc2hhcGUoZGF0YSA9IHFvZzEwaGRpLA0KICAgICAgICAgICAgICAgICAgICAgICMgaWR2YXIgPSAiY250cnkiLA0KICAgICAgICAgICAgICAgICAgICAgICMgdi5uYW1lcyA9ICJ1bmRwX2hkaSIsDQogICAgICAgICAgICAgICAgICAgICAgIyB0aW1ldmFyID0gInllYXIiLA0KICAgICAgICAgICAgICAgICAgICAgICMgZGlyZWN0aW9uID0gIndpZGUiKQ0KDQoNCg0KdGFibGUocW9nJGFsX2V0aG5pYyxxb2ckeWVhcikNCg0KcW9nMTQgPC0gc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAxNCkNCnFvZzE0JGNudHJ5PC1jb3VudHJ5Y29kZShxb2cxNCRjY29kZWNvdywgImNvd24iLCJjb3VudHJ5Lm5hbWUuZW4iKQ0KcW9nMTQgPC0gcW9nMTQgJT4lIGRwbHlyOjpzZWxlY3QoY250cnkseWVhcixjc3BmX2xlZ2l0KSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpDQpkYXRhX3dpZGUxOCA8LSByZXNoYXBlKGRhdGEgPSBxb2cxNCwNCiAgICAgICAgICAgICAgICAgICAgICAgaWR2YXIgPSAiY250cnkiLA0KICAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWVzID0gImNzcGZfbGVnaXQiLA0KICAgICAgICAgICAgICAgICAgICAgICB0aW1ldmFyID0gInllYXIiLA0KICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAid2lkZSIpDQoNCnFvZzE1IDwtIHN1YnNldChxb2cscW9nJHllYXI9PTIwMTUpDQpxb2cxNSRjbnRyeTwtY291bnRyeWNvZGUocW9nMTUkY2NvZGVjb3csICJjb3duIiwiY291bnRyeS5uYW1lLmVuIikNCnFvZzE1IDwtIHFvZzE1ICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsZmZwX3NsKSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpDQpkYXRhX3dpZGUxOSA8LSByZXNoYXBlKGRhdGEgPSBxb2cxNSwNCiAgICAgICAgICAgICAgICAgICAgICAgaWR2YXIgPSAiY250cnkiLA0KICAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWVzID0gImZmcF9zbCIsDQogICAgICAgICAgICAgICAgICAgICAgIHRpbWV2YXIgPSAieWVhciIsDQogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJ3aWRlIikNCg0KDQpxb2cxMCRjaXJpX3BoeXNpbnQ8LWFzLm51bWVyaWMocW9nMTAkY2lyaV9waHlzaW50KQ0KcW9nMTBhIDwtIHFvZzEwICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsY2lyaV9waHlzaW50KSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpDQpkYXRhX3dpZGUyMCA8LSByZXNoYXBlKGRhdGEgPSBxb2cxMGEsDQogICAgICAgICAgICAgICAgICAgICAgIGlkdmFyID0gImNudHJ5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lcyA9ICJjaXJpX3BoeXNpbnQiLA0KICAgICAgICAgICAgICAgICAgICAgICB0aW1ldmFyID0gInllYXIiLA0KICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAid2lkZSIpDQoNCnFvZzEwJGdkX3B0c3MgPC1hcy5udW1lcmljKHFvZzEwJGdkX3B0c3MpDQpxb2cxMGEgPC0gcW9nMTAgJT4lIGRwbHlyOjpzZWxlY3QoY250cnkseWVhcixnZF9wdHNzKSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpDQpkYXRhX3dpZGUyMSA8LSByZXNoYXBlKGRhdGEgPSBxb2cxMGEsDQogICAgICAgICAgICAgICAgICAgICAgIGlkdmFyID0gImNudHJ5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lcyA9ICJnZF9wdHNzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgdGltZXZhciA9ICJ5ZWFyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gIndpZGUiKQ0KDQpxb2cxNDwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAxNCkNCnFvZzEzPC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDEzKQ0KcW9nMTI8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMTIpDQpxb2cxMTwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAxMSkNCnFvZzEwPC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDEwKQ0KcW9nODwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAwOCkNCnFvZzc8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMDcpDQpxb2c2PC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDA2KQ0KcW9nNTwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAwNSkNCnFvZzQ8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMDQpDQpxb2czPC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDAzKQ0KcW9nMjwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAwMikNCnFvZzE8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMDEpDQpxb2cwPC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDAwKQ0KDQoNCg0KdGFibGUoaXMubmEocW9nJHdlbF9jdWx0dXJlKSxxb2ckeWVhcikNCmN1bHJlZzwtIHBtYXgocW9nMTQkd2VsX2N1bHR1cmUsIHFvZzEzJHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nMTIkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2cxMSR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzEwJHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nOCR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzckd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2c2JHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nNSR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzQkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2czJHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nMiR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzEkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2cwJHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBhcy5jaGFyYWN0ZXIoc2ptaXNjOjp0b19sYWJlbChjdWxyZWcpKQ0KY3VscmVnPC1hcy5kYXRhLmZyYW1lKGNiaW5kKGN1bHJlZyxxb2cxNCRjY29kZWNvdykpDQpvcmVhc3QgIDwtIHN1YnNldChjdWxyZWcsIGN1bHJlZyRjdWxyZWcgPT0gIk9ydGhvZG94IEVhc3QiKQ0Kb3JlYXN0DQoNCiNjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nMTAkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCg0KcW9nMTQkaHRfcmVnaW9uIA0KDQpjdWxyZWckY250cnk8LWNvdW50cnljb2RlKGN1bHJlZyRWMiwgImNvd24iLCJjb3VudHJ5Lm5hbWUuZW4iKQ0KdGFiZWxldHRvPC1tZXJnZSh0YWJsZV9zdHVmZixjdWxyZWcsYnk9ImNudHJ5IikNCnRhYmVsZXR0bzwtYXMuZGF0YS5mcmFtZShjYmluZCh0YWJsZV9zdHVmZiRyZWdpb25zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih0YWJsZV9zdHVmZiRjbnRyeSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKHRhYmVsZXR0byRjdWxyZWcpKSkNCnRhYmVsZXR0byA8LSB0YWJlbGV0dG9bb3JkZXIodGFiZWxldHRvJFYxLCB0YWJlbGV0dG8kVjMpLF0NCiNlZGl0KHRhYmVsZXR0bykNCg0KY3VscmVnPC1kYXRhLmZyYW1lKGNiaW5kKHRhYmVsZXR0byxjdWxyZWcpKQ0KY3VscmVnPC1jdWxyZWdbLGMoMiw0KV0NCm5hbWVzKGN1bHJlZylbMV08LWMoImNudHJ5IikNCg0KdGFibGVfc3R1ZmYzIDwtIG1lcmdlKHRhYmxlX3N0dWZmLGN1bHJlZyxieT0iY250cnkiKQ0KDQp0YWJsZShhcy5jaGFyYWN0ZXIodGFiZWxldHRvJFYzKSkNCg0KcW9nMTAwIDwtIHN1YnNldChxb2cscW9nJHllYXI9PTIwMTApDQpxb2cxMDAkY250cnk8LWNvdW50cnljb2RlKHNqbWlzYzo6dG9fbGFiZWwocW9nMTAwJGNjb2RlY293KSwgImNvd24iLCJjb3VudHJ5Lm5hbWUuZW4iKQ0KcW9nMTAwIDwtIHFvZzEwMCAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSx5ZWFyLGh0X3JlZ3R5cGUxKSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpDQpxb2cxMDAkcmVndHlwZTwtc2ptaXNjOjp0b19sYWJlbChxb2cxMDAkaHRfcmVndHlwZTEpDQpxb2cxMDAkeWVhciA8LSBOVUxMDQpxb2cxMDAkaHRfcmVndHlwZTEgPC0gTlVMTA0KdGFibGUocW9nMTAwJHJlZ3R5cGUpDQoNCg0KZXRobmljMTA8LWFzLm51bWVyaWMocm93TWVhbnMoZGF0YV93aWRlMTdbLDI6MTJdKSkgIyBtZWFuIG92ZXIgbGFzdCAxMCB5ZWFycyAoMjAwMCAtIDIwMTApDQpwaHlzaW50MTA8LWFzLm51bWVyaWMocm93TWVhbnMoZGF0YV93aWRlMjBbLDI6MTJdKSkgIyBtZWFuIG92ZXIgbGFzdCAxMCB5ZWFycyAoMjAwMCAtIDIwMTApDQp0ZXJyb3IxMDwtYXMubnVtZXJpYyhyb3dNZWFucyhkYXRhX3dpZGUyMVssMjoxMl0pKSAjIG1lYW4gb3ZlciBsYXN0IDEwIHllYXJzICgyMDAwIC0gMjAxMCkNCmxlZ2l0PC1hcy5udW1lcmljKGRhdGFfd2lkZTE4WywyXSkgIyBtZWFuIG92ZXIgbGFzdCAxMCB5ZWFycyAoMjAwMCAtIDIwMTApDQpsZWdpdDI8LWFzLm51bWVyaWMoZGF0YV93aWRlMTlbLDJdKSAjIG1lYW4gb3ZlciBsYXN0IDEwIHllYXJzICgyMDAwIC0gMjAxMCkNCnFvZ3RoaW5neTwtZGF0YS5mcmFtZShkYXRhX3dpZGUxOVssMV0sZXRobmljMTAsbGVnaXQsbGVnaXQyLHBoeXNpbnQxMCx0ZXJyb3IxMCkNCmNvbG5hbWVzKHFvZ3RoaW5neSlbMV08LWMoImNudHJ5IikNCnFvZ3RoaW5neTwtbWVyZ2UoeD1xb2d0aGluZ3ksIHk9cW9nMTAwLCBieT0iY250cnkiKQ0KDQojcW9ndGhpbmd5PC1kYXRhLmZyYW1lKGRhdGFfd2lkZTE3WywxXSxldGhuaWMxMCkNCiNjb2xuYW1lcyhxb2d0aGluZ3kpWzFdPC1jKCJjbnRyeSIpDQojY29tYmluZWQgPC0gbWVyZ2UoeD1xb2d0aGluZ3ksIHk9Y29tYmluZWQsIGJ5PSJjbnRyeSIpDQoNCg0KcW9nX2NzIDwtcmVhZF9zcHNzKCJDOi9Vc2Vycy9GYXZvbmUvRG93bmxvYWRzL3FvZ19zdGRfY3NfamFuMTcuc2F2IikgI2xvYWRpbmcgZGF0YXNldA0KcW9nX2NzJGNudHJ5PC1jb3VudHJ5Y29kZShxb2dfY3MkY2NvZGVjb3csICJjb3duIiwiY291bnRyeS5uYW1lLmVuIikNCnFvZ19jcyRsZWdpdDM8LWFzLm51bWVyaWMocW9nX2NzJGdvdl9peGxlZ2l0aW1hY3lpbmRleCkNCg0KbGVnaXRfZGF0PC1kYXRhLmZyYW1lKHFvZ19jcyRjbnRyeSxxb2dfY3MkbGVnaXQzKQ0KY29sbmFtZXMobGVnaXRfZGF0KTwtYygiY250cnkiLCJsZWdpdDMiKQ0KDQphZ2dyZGVsaWIgPC0gbWVyZ2UoeD1sZWdpdF9kYXQsIHk9YWdncmRlbGliLCBieT0iY250cnkiKQ0KDQphZ2dyZGVsaWIkbGVnaXQzIDwtIHJhbmdlMDEoYWdncmRlbGliJGxlZ2l0MykNCmNvcihuYS5vbWl0KGFnZ3JkZWxpYlssYyg0LDUsNywxMyldKSkNCmNvcihuYS5vbWl0KGFnZ3JkZWxpYlssYyg0LDUsMiw2OjEzKV0pKQ0KDQphZ2dyZGVsaWIkbGVnaXQgPC0gMS1yYW5nZTAxKGFnZ3JkZWxpYiRsZWdpdCkNCmFnZ3JkZWxpYiRsZWdpdDIgPC0gMS1yYW5nZTAxKGFnZ3JkZWxpYiRsZWdpdDIpDQphZ2dyZGVsaWIkYXNpYSA8LSBhZ2dyZGVsaWIkZS5hc2lhICsgYWdncmRlbGliJHMuZS5hc2lhICsgYWdncmRlbGliJHMuYXNpYSArIGFnZ3JkZWxpYiRwYWNpZmljDQoNClNGSSA8LXJlYWRfc3BzcygiQzovVXNlcnMvRmF2b25lL0Rvd25sb2Fkcy9TRkl2MjAxNi5zYXYiKSAjbG9hZGluZyBkYXRhc2V0DQpTRkkgPC0gc3Vic2V0KFNGSSxTRkkkeWVhcj09MjAxNSkNClNGSSRjbnRyeSA8LWNvdW50cnljb2RlKFNGSSRjb3VudHJ5LCAiY291bnRyeS5uYW1lLmVuIiwiY291bnRyeS5uYW1lLmVuIikgDQpTRkkkY250cnlbNzldIDwtICJOb3J0aCBLb3JlYSINClNGSSRjbnRyeSA8LWNvdW50cnljb2RlKFNGSSRjbnRyeSwgImNvdW50cnkubmFtZS5lbiIsImNvdW50cnkubmFtZS5lbiIpIA0KU0ZJJGxlZ2l0aW1hY3kgPC0gU0ZJJGxlZ2l0DQpTRkkkbGVnaXQgPC0gTlVMTA0KDQoNCmFnZ3JkZWxpYiA8LSBtZXJnZSh4PVNGSSwgeT1hZ2dyZGVsaWIsIGJ5PSJjbnRyeSIpDQoNCmhkaSA8LSByZWFkX2NzdigiaGRpLmNzdiIpDQpoZGkkY250cnk8LWNvdW50cnljb2RlKGhkaSRDb3VudHJ5LCAiY291bnRyeS5uYW1lLmVuIiwiY291bnRyeS5uYW1lLmVuIikNCmhkaSQnMTk5MCc8LSBOVUxMIDsgaGRpJCcxOTkxJzwtIE5VTEwgOyBoZGkkJzE5OTInPC0gTlVMTCA7IGhkaSQnMTk5Myc8LSBOVUxMDQpoZGkkJzE5OTQnPC0gTlVMTDsgaGRpJCcxOTk1JzwtIE5VTEw7IGhkaSQnMTk5Nic8LSBOVUxMOyBoZGkkJzE5OTcnPC0gTlVMTA0KaGRpJCcxOTk4JzwtIE5VTEwgOyBoZGkkJzE5OTknPC0gTlVMTCA7IGhkaSQnMjAxMSc8LSBOVUxMIDsgaGRpJCcyMDEyJzwtIE5VTEwNCmhkaSQnMjAxMyc8LSBOVUxMOyBoZGkkJzIwMTQnPC0gTlVMTDsgaGRpJCcyMDE1JzwtIE5VTEw7aGRpJGBIREkgUmFuayAoMjAxNSlgPC0gTlVMTA0KaGRpJENvdW50cnk8LSBOVUxMDQpoZGkxMDwtYXMubnVtZXJpYyhyb3dNZWFucyhoZGlbLDE6MTFdKSkgDQpoZGF0PC1kYXRhLmZyYW1lKGhkaSRjbnRyeSxoZGkxMCkgDQpuYW1lcyhoZGF0KTwtYygiY250cnkiLCJoZGkxMCIpDQoNCmFnZ3JkZWxpYiA8LSBtZXJnZSh4PWhkYXQsIHk9YWdncmRlbGliLCBieT0iY250cnkiKQ0KI3RhYmxlKGFnZ3JkZWxpYiRoZGkxMCkNCiNnYygpDQojY29tYmluZWQgPC0gbWVyZ2UoeD1oZGF0LCB5PWNvbWJpbmVkLCBieT0iY250cnkiKQ0KDQoNCiNjb2xuYW1lcyhhZ2dyZGVsaWIpWzldPC0iZV9wX3BvbGl0eSINCiNsb3A8LXN1YnNldCh2ZGVtc19zdGFydCx2ZGVtc19zdGFydCR5ZWFyPT0yMDEwKQ0KDQpjb3IobmEub21pdChhZ2dyZGVsaWIyWywyOjE3XSkpDQpjb3IobmEub21pdChkYXRhLmZyYW1lKGFnZ3JkZWxpYiRwb2xpdHkxMCxhZ2dyZGVsaWIkZGVsaWIxMCkpKQ0KDQojaGlzdCh2ZGVtcyR2MmRsY29uc2x0KQ0KI2hpc3QodmRlbXMkdjJ4Y2xfZGlzYykNCiN0YWJsZSh2ZGVtc19zdGFydCRlX2JvaXhfcmVnaW1lLHZkZW1zX3N0YXJ0JHllYXIpDQojdGFibGUodmRlbXNfc3ViJGVfcF9wb2xpdHksdmRlbXNfc3ViJHllYXIpDQoNCiMjIyMjIG1lcmdpbmcgdGltZSAjIyMjDQoNCmNvbWJpbmVkIDwtIG1lcmdlKHg9bWVyZ2VkLCB5PWFnZ3JkZWxpYiwgYnk9ImNudHJ5IikNCnRhYmxlKGNvbWJpbmVkJGNudHJ5KQ0KDQpjb21iaW5lZCA8LSBhcy5kYXRhLmZyYW1lKGNvbWJpbmVkKQ0KY29tYmluZWQkZ292X3RydXN0IDwtIGFzLm51bWVyaWMoY29tYmluZWQkZ292X3RydXN0KQ0KY29tYmluZWQkYWdlIDwtIGFzLm51bWVyaWMoY29tYmluZWQkYWdlKQ0KY29tYmluZWQkaW5jb21lIDwtIGFzLm51bWVyaWMoY29tYmluZWQkaW5jb21lKQ0KY29tYmluZWQkZWR1YyA8LSBhcy5udW1lcmljKGNvbWJpbmVkJGVkdWMpDQpjb21iaW5lZCRzZXggPC0gYXMuZmFjdG9yKGNvbWJpbmVkJHNleCkNCmNvbWJpbmVkJGF1dGhvcml0YXJpYW4gPC0gYXMubnVtZXJpYyhjb21iaW5lZCRhdXRob3JpdGFyaWFuKQ0KY29tYmluZWQkc2FmZXR5IDwtIGFzLm51bWVyaWMoY29tYmluZWQkc2FmZXR5KQ0KY29tYmluZWQkZGVtdG9kYXkgPC0gYXMubnVtZXJpYyhjb21iaW5lZCRkZW10b2RheSkNCmNvbWJpbmVkJGxhdGlubyA8LSBmYWN0b3IoY29tYmluZWQkbGF0aW5vKQ0KY29tYmluZWQkYWZybyA8LSBmYWN0b3IoY29tYmluZWQkYWZybykNCmNvbWJpbmVkJGFtZXJpY2FzIDwtIGZhY3Rvcihjb21iaW5lZCRhbWVyaWNhcykNCmNvbWJpbmVkJGFzaWEgPC0gY29tYmluZWQkZS5hc2lhICsgY29tYmluZWQkcy5lLmFzaWEgKyBjb21iaW5lZCRzLmFzaWEgKyBjb21iaW5lZCRwYWNpZmljDQoNCmNvcihuYS5vbWl0KGRhdGEuZnJhbWUoY29tYmluZWQkZ292X3RydXN0LGNvbWJpbmVkJGluY29tZSxjb21iaW5lZCRlZHVjLCAjU29jaW9lY29ub21pYyBmYWN0b3JzDQogICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkJGRlbGliMTAsIGNvbWJpbmVkJHBvbGl0eTEwLCBjb21iaW5lZCRnZHAxMCwgY29tYmluZWQkZGVtdG9kYXkpKSkNCg0KY29tYmluZWQkY250cnk8LWFzLmZhY3Rvcihjb21iaW5lZCRjbnRyeSkNCg0KDQojY29tYmluZWQkcG9saXR5MTAgPC0gY29tYmluZWQkcG9saXR5MTAqMjAtMTANCg0KI2NvbWJpbmVkJHJlZ2ltZSA8LSBjb21iaW5lZCRwb2xpdHkxMA0KI2NvbWJpbmVkJHJlZ2ltZVtjb21iaW5lZCRwb2xpdHlfYXV0b2R1bW15PT0xXSA8LSAiYXV0byINCiNjb21iaW5lZCRyZWdpbWVbY29tYmluZWQkcG9saXR5X2Fub2R1bW15PT0xXSA8LSAiYW5vIg0KI2NvbWJpbmVkJHJlZ2ltZVtjb21iaW5lZCRwb2xpdHlfZGVtZHVtbXk9PTFdIDwtICJkZW1vIg0KDQpoaXN0KGNvbWJpbmVkJGdvdl90cnVzdCkNCnFwbG90KGNvbWJpbmVkJGdvdl90cnVzdCkNCg0KY29tYmluZWQkY250cnkNCg0KDQoNCiNwaHlzaV9zIDwtIHZkZW1zX3N1YjIgJT4lIGRwbHlyOjpzZWxlY3QoY250cnllYXJzLCBmcmFueikNCg0KI2NvbWJpbmVkIDwtIG1lcmdlKGNvbWJpbmVkLCBwaHlzaV9zLCBieSA9ICJjbnRyeWVhcnMiKQ0KDQojcGh5c2kyX3MgPC0gZGRwbHkoY29tYmluZWQsfmNudHJ5LA0KIyAgICAgICAgICAgICAgICBzdW1tYXJpc2UscG9saXRjYXQ9bWVhbihmcmFueixuYS5ybT1UKSkNCg0KI2NvbWJpbmVkIDwtIG1lcmdlKGNvbWJpbmVkLCBwaHlzaTJfcywgYnkgPSAiY250cnkiKQ0KDQoNCnZkZW1zX3N1YjIkY250cnllYXJzIDwtIHBhc3RlKHZkZW1zX3N1YjIkY250cnksdmRlbXNfc3ViMiR5ZWFyKQ0KDQpwaHlzaSA8LSB2ZGVtc19zdWIyICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5ZWFycywgcGVyYykNCg0KY29tYmluZWQgPC0gbWVyZ2UoY29tYmluZWQsIHBoeXNpLCBieSA9ICJjbnRyeWVhcnMiKQ0KDQpwaHlzaTIgPC0gZGRwbHkoY29tYmluZWQsfmNudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlLHBoeXN2aW9sPW1lYW4ocGVyYyxuYS5ybT1UKSkNCg0KY29tYmluZWQgPC0gbWVyZ2UoY29tYmluZWQsIHBoeXNpMiwgYnkgPSAiY250cnkiKQ0KDQoNCg0KDQoNCiNwaHlzaV8yMiRkaXMzIDwtcm91bmQocGh5c2lfMjIkZGlzMikNCg0KI3VuaXF1ZShwaHlzaTJfcyRjbnRyeSkNCg0KIzEtMi41DQojMy01DQojNS41IC0gNw0KI3BoeXNpMl9zJHBvbGl0Y2F0MjwtOC0oKHBoeXNpMl9zJHBvbGl0Y2F0KSAqICg3LzEwKSkNCiMxMSANCg0KI3BoeXNpMl9zJHBvbGl0eV9kZW1kdW1teSA8LSBwaHlzaTJfcyRwb2xpdGNhdDINCiNwaHlzaTJfcyRwb2xpdHlfZGVtZHVtbXkgW3BoeXNpMl9zJHBvbGl0Y2F0MiA8PSAyLjVdIDwtIDENCiNwaHlzaTJfcyRwb2xpdHlfZGVtZHVtbXkgW3BoeXNpMl9zJHBvbGl0Y2F0MiA+ICAyLjVdIDwtIDANCiN0YWJsZShwaHlzaTJfcyRwb2xpdHlfZGVtZHVtbXkpDQoNCiNwaHlzaTJfcyRwb2xpdHlfYW5vZHVtbXkgPC0gcGh5c2kyX3MkcG9saXRjYXQyDQojcGh5c2kyX3MkcG9saXR5X2Fub2R1bW15W3BoeXNpMl9zJHBvbGl0Y2F0MiA+IDIuNSAmIHBoeXNpMl9zJHBvbGl0Y2F0MiA8IDUuNV0gPC0gMQ0KI3BoeXNpMl9zJHBvbGl0eV9hbm9kdW1teVtwaHlzaTJfcyRwb2xpdGNhdDIgPD0gMi41IHwgcGh5c2kyX3MkcG9saXRjYXQyID49IDUuNV0gPC0gMA0KI3RhYmxlKHBoeXNpMl9zJHBvbGl0eV9hbm9kdW1teSkNCg0KI3BoeXNpMl9zJHBvbGl0eV9hdXRvZHVtbXkgPC0gcGh5c2kyX3MkcG9saXRjYXQyDQojcGh5c2kyX3MkcG9saXR5X2F1dG9kdW1teVtwaHlzaTJfcyRwb2xpdGNhdDIgPj0gNS41XSA8LSAxDQojcGh5c2kyX3MkcG9saXR5X2F1dG9kdW1teVtwaHlzaTJfcyRwb2xpdGNhdDIgPCA1LjVdIDwtIDANCiN0YWJsZShwaHlzaTJfcyRwb2xpdHlfYXV0b2R1bW15KQ0KDQojcGh5c2kyX3MkcmVnaW1lIDwtIHBoeXNpMl9zJHBvbGl0Y2F0DQojcGh5c2kyX3MkcmVnaW1lW3BoeXNpMl9zJHBvbGl0eV9hdXRvZHVtbXk9PTFdIDwtICJhdXRvIg0KI3BoeXNpMl9zJHJlZ2ltZVtwaHlzaTJfcyRwb2xpdHlfYW5vZHVtbXk9PTFdIDwtICJhbm8iDQojcGh5c2kyX3MkcmVnaW1lW3BoeXNpMl9zJHBvbGl0eV9kZW1kdW1teT09MV0gPC0gImRlbW8iDQoNCiN1bmlxdWUocGh5c2kyX3MkY250cnkpDQoNCnRhYmxlKHBoeXNpMl9zJHJlZ2ltZSkNCg0KcW9nMjAwMCA8LSBzdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDEwIHwNCiAgICAgICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMTEgfCAgDQogICAgICAgICAgICAgICAgICAgICAgIHFvZyR5ZWFyPT0yMDEyIHwgDQogICAgICAgICAgICAgICAgICAgICAgIHFvZyR5ZWFyPT0yMDEzIHwgDQogICAgICAgICAgICAgICAgICAgICAgIHFvZyR5ZWFyPT0yMDE0IHwgDQogICAgICAgICAgICAgICAgICAgICAgIHFvZyR5ZWFyPT0yMDE1KQ0KDQp0YWJsZShxb2cyMDAwJGdkX3B0c2EscW9nMjAwMCR5ZWFyKQ0KDQpxb2cyMDAwJHBlcmMyIDwtIHFvZzIwMDAkZ2RfcHRzYQ0KDQpxb2cyMDAwJGNudHJ5PC1jb3VudHJ5Y29kZShxb2cyMDAwJGNjb2RlY293LCAiY293biIsImNvdW50cnkubmFtZS5lbiIpDQoNCnFvZzIwMDAkY250cnllYXJzIDwtIHBhc3RlKHFvZzIwMDAkY250cnkscW9nMjAwMCR5ZWFyKQ0KDQpwaHlzaTIwMDAgPC0gcW9nMjAwMCAlPiUgZHBseXI6OnNlbGVjdChjbnRyeWVhcnMsIHBlcmMyKQ0KDQpjb21iaW5lZCA8LSBtZXJnZShjb21iaW5lZCwgcGh5c2kyMDAwLCBieSA9ICJjbnRyeWVhcnMiKQ0KDQpwaHlzaTIyMDAwIDwtIGRkcGx5KGNvbWJpbmVkLH5jbnRyeSwNCiAgICAgICAgICAgICAgICBzdW1tYXJpc2UsdGVycm9yPW1lYW4ocGVyYzIsbmEucm09VCkpDQoNCmNvbWJpbmVkIDwtIG1lcmdlKGNvbWJpbmVkLCBwaHlzaTIyMDAwLCBieSA9ICJjbnRyeSIpDQoNCiN0YWJsZShxb2cyMDAwJHVuZHBfaGRpLHFvZzIwMDAkeWVhcikNCg0KI3BoeXNpZmYgPC0gcW9nMjAwMCAlPiUgZHBseXI6OnNlbGVjdChjbnRyeWVhcnMsIHVuZHBfaGRpKQ0KDQojY29tYmluZWQgPC0gbWVyZ2UoY29tYmluZWQsIHBoeXNpZmYsIGJ5ID0gImNudHJ5ZWFycyIpDQoNCiNwaHlzaWZmMiA8LSBkZHBseShjb21iaW5lZCx+Y250cnksDQojICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UsaGRpPW1lYW4odW5kcF9oZGksbmEucm09VCkpDQoNCiNjb21iaW5lZCA8LSBtZXJnZShjb21iaW5lZCwgcGh5c2lmZjIsIGJ5ID0gImNudHJ5IikNCg0KDQpnbmkgPC0gcmVhZF9jc3YoIkdOSS5jc3YiLCAgc2tpcCA9IDEpDQoNCmduaSRgMjAxNWA8LWdzdWIoInR0dCIsIiIsZ25pJGAyMDE1YCkNCmduaSRgMjAxNWA8LWdzdWIoImZmIiwiIixnbmkkYDIwMTVgKQ0KZ25pJGAyMDE1YDwtZ3N1Yigic3NzIiwiIixnbmkkYDIwMTVgKQ0KZ25pJGAyMDE1YDwtZ3N1YigidXV1IiwiIixnbmkkYDIwMTVgKQ0KZ25pJGAyMDE1YDwtZ3N1YigibyIsIiIsZ25pJGAyMDE1YCkNCmduaSRgMjAxNWAgPC0gYXMubnVtZXJpYyhnbmkkYDIwMTVgKQ0KDQpnbmkkYDIwMTRgPC1nc3ViKCJ0dHQiLCIiLGduaSRgMjAxNGApDQpnbmkkYDIwMTRgPC1nc3ViKCJmZiIsIiIsZ25pJGAyMDE0YCkNCmduaSRgMjAxNGA8LWdzdWIoInNzcyIsIiIsZ25pJGAyMDE0YCkNCmduaSRgMjAxNGA8LWdzdWIoInV1dSIsIiIsZ25pJGAyMDE0YCkNCmduaSRgMjAxNGA8LWdzdWIoIm8iLCIiLGduaSRgMjAxNGApDQpnbmkkYDIwMTRgIDwtIGFzLm51bWVyaWMoZ25pJGAyMDE0YCkNCg0KZ25pPC1nbmlbLGMoMiwyMzoyOCldDQoNCmduaTwtZ2F0aGVyKGFzLmRhdGEuZnJhbWUoZ25pKSxrZXkgPSAiQ291bnRyeSIpDQpuYW1lcyhnbmkpIDwtIGMoImNudHJ5IiwieWVhciIsImduaSIpDQoNCmduaSRjbnRyeTwtY291bnRyeWNvZGUoZ25pJGNudHJ5LCJjb3VudHJ5Lm5hbWUuZW4iLCJjb3VudHJ5Lm5hbWUuZW4iKQ0KZ25pJGNudHJ5ZWFycyA8LSBwYXN0ZShnbmkkY250cnksZ25pJHllYXIpDQoNCnBoeXNpZ25pIDwtIGduaSAlPiUgZHBseXI6OnNlbGVjdChjbnRyeWVhcnMsIGduaSkNCg0KY29tYmluZWQgPC0gbWVyZ2UoY29tYmluZWQsIHBoeXNpZ25pLCBieSA9ICJjbnRyeWVhcnMiKQ0KDQpwaHlzaWduaTIgPC0gZGRwbHkoY29tYmluZWQsfmNudHJ5LA0KICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UsZ25pX2M9bWVhbihnbmksbmEucm09VCkpDQoNCmNvbWJpbmVkIDwtIG1lcmdlKGNvbWJpbmVkLCBwaHlzaWduaTIsIGJ5ID0gImNudHJ5IikNCg0KDQoNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=